1 00:00:04.925 --> 00:00:08.925 실감 기본편 언리얼 엔진 ICVFX 최적화 2 00:00:23.775 --> 00:00:25.525 여러분 안녕하십니까 3 00:00:25.525 --> 00:00:30.275 언리얼 엔진 ICVFX 강의를 진행하게 된 이도한입니다 4 00:00:31.125 --> 00:00:34.775 오늘은 ICVFX 환경에서 웹 컨트롤을 활용해 5 00:00:34.775 --> 00:00:37.625 언리얼 엔진의 성능을 최적화하고 6 00:00:37.625 --> 00:00:41.075 작업 효율을 높이는 방법에 대해서 이야기를 해보겠습니다 7 00:00:41.075 --> 00:00:45.625 ICVFX 환경에서는 단순한 환경 설정만으로는 충분하지 않습니다 8 00:00:45.625 --> 00:00:48.725 실시간으로 다양한 요소를 제어하고 9 00:00:48.725 --> 00:00:51.275 최적화하는 것이 정말 필수적인데요 10 00:00:51.275 --> 00:00:56.075 이를 위해 웹 컨트롤이라는 매우 유용한 도구를 활용할 수 있습니다 11 00:00:56.475 --> 00:01:00.025 이번 강의에서는 웹 컨트롤의 설정 방법과 12 00:01:00.025 --> 00:01:03.475 이를 활용해 실시간 조명, 카메라 설정 13 00:01:03.475 --> 00:01:07.425 그리고 다양한 엔진 요소를 최적화하는 방법을 설명드리겠습니다 14 00:01:07.425 --> 00:01:11.425 ICVFX를 위한 언리얼 엔진 환경 최적화 15 00:01:12.175 --> 00:01:15.275 ICVFX를 진행하면서 LED 월에서 16 00:01:15.275 --> 00:01:18.225 애셋을 사실적으로 표현하기 위해서는 17 00:01:18.225 --> 00:01:21.725 고해상도의 텍스처, 복잡한 라이팅 18 00:01:21.725 --> 00:01:24.825 그리고 섬세한 디테일이 필요합니다 19 00:01:24.825 --> 00:01:28.925 그러나 이러한 요소들은 실시간 구동에는 큰 부담을 주어 20 00:01:28.925 --> 00:01:32.274 성능 저하와 렉을 유발할 수 있습니다 21 00:01:32.274 --> 00:01:36.624 반대로 성능을 최우선으로 고려해 최적화를 진행하게 되면 22 00:01:36.624 --> 00:01:39.324 퀄리티를 어느 정도 타협하거나 23 00:01:39.324 --> 00:01:42.324 포기해야 하는 상황이 발생할 수 있습니다 24 00:01:42.324 --> 00:01:45.124 최적화 과정에서 텍스처 해상도를 낮추거나 25 00:01:45.124 --> 00:01:46.574 디테일을 줄이게 되면 26 00:01:46.574 --> 00:01:48.424 의도한 리얼리티와 몰입감을 27 00:01:48.424 --> 00:01:51.874 완벽히 구현하기가 어려워질 수 있습니다 28 00:01:51.874 --> 00:01:54.474 이러한 현실적 한계를 극복하면서 29 00:01:54.474 --> 00:01:58.424 성능과 퀄리티 사이에서 균형을 맞추기 위해 30 00:01:58.424 --> 00:02:03.724 다양한 최적화 전략을 적용하는 것이 매우 중요합니다 31 00:02:04.074 --> 00:02:08.024 우선 저희가 이번 강의에서 사용할 프로젝트 파일은 32 00:02:08.024 --> 00:02:10.774 메가스캔에서 무료로 제공해주는 33 00:02:10.774 --> 00:02:13.724 버려진 아파트 프로젝트 파일을 사용하도록 하겠습니다 34 00:02:15.274 --> 00:02:16.724 저희가 작업하다 보면 35 00:02:16.724 --> 00:02:20.474 보통 렉은 레벨 내 과도한 오브젝트의 수 36 00:02:20.474 --> 00:02:24.624 이런 Mesh나 이런 Mesh들이 되겠죠 37 00:02:25.324 --> 00:02:29.224 그리고 높은 폴리곤 수 38 00:02:30.174 --> 00:02:35.074 이런 트라이앵글, 이런 폴리곤 수가 되겠죠 39 00:02:35.074 --> 00:02:36.824 또는 복잡한 라이팅 40 00:02:36.824 --> 00:02:40.524 라이팅이 여러 가지가 배치가 되어 있다면 41 00:02:40.524 --> 00:02:43.124 많은 리소스를 잡아먹게 될 겁니다 42 00:02:43.124 --> 00:02:45.624 이러한 문제를 해결하기 위해서 43 00:02:45.624 --> 00:02:48.574 사용할 수 있는 콘솔 명령어와 최적화 방법들을 44 00:02:48.574 --> 00:02:51.074 함께 알아보도록 하겠습니다 45 00:02:51.624 --> 00:02:55.224 우선 저희는 프로파일링에 대해서 알아보도록 하겠습니다 46 00:02:55.224 --> 00:02:59.674 프로파일링은 CPU, GPU, 메모리와 같은 자원이 47 00:02:59.674 --> 00:03:03.974 어디에서 사용되는지 파악하기 위한 중요한 도구입니다 48 00:03:04.274 --> 00:03:07.624 언리얼 엔진에서는 Stat Unit과 같은 49 00:03:07.624 --> 00:03:10.174 다양한 콘솔 명령어가 제공되며 50 00:03:10.174 --> 00:03:14.824 이를 통해 병목 현상이 어디서 발생하는지 찾아낼 수 있습니다 51 00:03:14.824 --> 00:03:17.424 일단 가장 기본적으로 52 00:03:17.424 --> 00:03:21.874 사용하는 명령어에 대해서 설명을 드리겠습니다 53 00:03:21.874 --> 00:03:24.824 아까 말씀드린 Stat Unit 같은 경우를 54 00:03:24.824 --> 00:03:28.724 사용하는 방법에 대해서 알려드리겠습니다 55 00:03:28.724 --> 00:03:31.174 일단 저는 지금 켜놔서 다시 끄고 56 00:03:32.824 --> 00:03:38.674 Command 라인에 Stat Unit을 검색하시면 57 00:03:38.674 --> 00:03:43.824 저와 같이 오른쪽에 이런 표시를 볼 수 있습니다 58 00:03:46.674 --> 00:03:50.324 일단 이 옵션에 대해서 설명을 드리자면 59 00:03:50.324 --> 00:03:56.174 현재 프레임에 소모된 시간과 게임 스레드에 소요된 시간 60 00:03:56.174 --> 00:03:58.824 렌더링 스레드에 소모된 시간 61 00:03:58.824 --> 00:04:04.074 GPU에서 현재 프레임에 소모된 시간 등을 파악할 수가 있습니다 62 00:04:04.074 --> 00:04:07.024 일단 첫 번째 옵션에 대해서 설명을 드리자면 63 00:04:07.024 --> 00:04:12.624 첫 번째 옵션은 게임의 한 프레임을 생성하는데 소요된 64 00:04:12.624 --> 00:04:15.074 총 시간을 볼 수 있습니다 65 00:04:15.074 --> 00:04:17.573 그리고 그 아래에 있는 옵션을 보시면 66 00:04:17.573 --> 00:04:20.873 게임 스레드에서 사용된 시간 값이 67 00:04:20.873 --> 00:04:24.173 이 값이 프레임 시간과 유사하게 되면 68 00:04:24.173 --> 00:04:26.723 게임 성능은 렌더링 스레드에 69 00:04:26.723 --> 00:04:30.073 병목 현상이 발생한 것으로 볼 수 있습니다 70 00:04:30.723 --> 00:04:32.823 그 아래의 옵션을 보게 되면 71 00:04:32.823 --> 00:04:36.073 렌더링 스레드에서 사용된 시간 값이 72 00:04:36.073 --> 00:04:39.123 이 값이 프레임과 비슷하면 73 00:04:39.123 --> 00:04:41.673 게임 성능은 렌더링 스레드에 의해 74 00:04:41.673 --> 00:04:45.473 병목 현상이 발생한 것으로 확인이 가능합니다 75 00:04:45.473 --> 00:04:49.323 게임과는 반대로 이루어지는 것이죠 76 00:04:50.623 --> 00:04:52.173 그 아래에 있는 것은 77 00:04:52.173 --> 00:04:55.023 렌더링 하드웨어 인터페이스 스레드에서 78 00:04:55.023 --> 00:04:57.623 소요된 시간이라고 할 수 있습니다 79 00:04:58.223 --> 00:05:03.473 이 부분 같은 경우에는 3D OpenGL이라든지 80 00:05:03.473 --> 00:05:07.523 D3D 다이렉트 12라든지 다이렉트 11 81 00:05:07.523 --> 00:05:11.523 이런 쪽에 관련되어 있어서 이 부분은 패스하도록 하겠습니다 82 00:05:12.173 --> 00:05:15.523 그 아래에 있는 GPU 타임은 83 00:05:15.523 --> 00:05:18.823 실시간 저희가 보고 있는 이 Scene에서 84 00:05:18.823 --> 00:05:22.423 렌더링에 사용된 GPU에서 소요된 시간 85 00:05:22.423 --> 00:05:26.023 이것도 마찬가지로 프레임 시간에 동기화되므로 86 00:05:26.023 --> 00:05:28.773 비슷한 시간을 가지게 됩니다 87 00:05:30.723 --> 00:05:35.673 그 아래에 있는 DynRes 옵션은 88 00:05:35.673 --> 00:05:39.273 Dynamic Resolution인 동적 해상도의 약자로 89 00:05:39.273 --> 00:05:42.623 게임에서 실시간으로 해상도를 자동으로 조정하여 90 00:05:42.623 --> 00:05:46.473 성능을 최적화할 수 있는 기능이라고 보시면 됩니다 91 00:05:46.473 --> 00:05:51.223 쉽게 말해서 장면이 복잡해져서 GPU가 느려지면 92 00:05:51.223 --> 00:05:55.323 해상도를 잠시 낮춰 성능을 개선할 수 있는 기능입니다 93 00:05:55.323 --> 00:05:58.773 보통 이거는 비활성화가 되어 있지만 94 00:05:58.773 --> 00:06:02.823 이를 사용하려면 프로젝트 설정에서 활성화가 가능합니다 95 00:06:02.823 --> 00:06:07.123 이거는 추후에 프로젝트 설정하는 편에서 보여드리겠습니다 96 00:06:08.723 --> 00:06:11.773 그 아래에 있는 이 옵션에 대해서 보여드리면 97 00:06:11.773 --> 00:06:16.473 즉, 이 옵션은 드로우 콜의 수를 의미합니다 98 00:06:16.473 --> 00:06:19.623 드로우 콜이라고 하면 CPU가 GPU에게 99 00:06:19.623 --> 00:06:24.873 이 오브젝트를 그려라라고 명령을 하는 일종의 호출입니다 100 00:06:24.873 --> 00:06:29.323 즉, 드로우 콜 수는 GPU가 그려야 하는 101 00:06:29.323 --> 00:06:31.423 객체의 수와 관련이 있습니다 102 00:06:31.423 --> 00:06:34.023 저는 한 2500개가 있다는 거겠죠 103 00:06:37.023 --> 00:06:39.823 그 아래에 있는 옵션에 대해서 설명을 드리자면 104 00:06:39.823 --> 00:06:42.223 현재 오브젝트가 갖고 있는 105 00:06:42.223 --> 00:06:48.823 제가 지금 보고 있는 삼각형의 수라고 보시면 될 것 같아요 106 00:06:48.823 --> 00:06:57.622 한 면에 삼각형이 이렇게 하나, 하나, 하나, 하나 107 00:06:57.622 --> 00:07:00.722 이 삼각형을 뜻한다고 보시면 될 것 같습니다 108 00:07:01.872 --> 00:07:05.722 이를 통해서 기본적으로 렉이 어떻게 걸리고 109 00:07:05.722 --> 00:07:11.522 어느 부위에서 성능을 저하시키고 있는지 확인할 수가 있습니다 110 00:07:11.522 --> 00:07:16.922 추가적으로 Stat 명령에 대해서 설명을 좀 드리도록 하겠습니다 111 00:07:16.922 --> 00:07:22.072 일단 오른쪽에 있는 이 옵션들을 해제를 하려면 112 00:07:22.072 --> 00:07:28.722 아까와 똑같은 Stat Unit를 검색하시면 사라지게 됩니다 113 00:07:28.722 --> 00:07:34.472 일단 또 기본적으로 사용하는 옵션은 Stat FPS가 있습니다 114 00:07:34.472 --> 00:07:41.172 말 그대로 이 옵션은 현재 프레임 속도 FPS를 보여주게 됩니다 115 00:07:41.172 --> 00:07:45.072 FPS가 높을수록 성능이 좋다는 의미입니다 116 00:07:45.072 --> 00:07:48.072 이 명령어는 전반적인 성능 상태를 117 00:07:48.072 --> 00:07:51.322 쉽고 빠르게 확인하는데 유용합니다 118 00:07:51.322 --> 00:07:55.072 근데 다양한 내용은 나오지 않겠죠 119 00:07:57.872 --> 00:08:10.522 다시 없애고 그다음은 Stat UnitGraph입니다 120 00:08:12.372 --> 00:08:16.922 이 옵션 같은 경우에는 Stat Unit에서 각 항목 121 00:08:16.922 --> 00:08:20.772 프레임, 게임, 드로우, GPU 등 122 00:08:20.772 --> 00:08:25.522 이 값을 그래프로 시각화해서 시각적으로 보여주게 됩니다 123 00:08:25.522 --> 00:08:29.922 시간의 경과에 따라 각 스레드가 얼마나 많은 시간을 소모하는지 124 00:08:29.922 --> 00:08:31.372 쉽게 확인할 수 있어 125 00:08:31.372 --> 00:08:35.372 병목 현상을 파악하는 데 도움이 됩니다 126 00:08:35.372 --> 00:08:37.322 이 그래프를 보시면 이렇게 127 00:08:37.322 --> 00:08:39.772 실시간으로 변하는 걸 보실 수가 있습니다 128 00:08:39.772 --> 00:08:42.422 또한 오른쪽에 컬러도 바뀌어서 129 00:08:42.422 --> 00:08:45.572 이 컬러대로 나온다고 보시면 될 것 같아요 130 00:08:45.572 --> 00:08:52.022 이 옵션도 없애려면 이렇게 131 00:09:00.022 --> 00:09:08.272 그다음 옵션은 Stat Game이라고 합니다 132 00:09:08.272 --> 00:09:12.072 이 옵션 같은 경우에는 게임 스레드에서 133 00:09:12.072 --> 00:09:15.572 각종 작업에 소요되는 시간을 내역으로 보여줍니다 134 00:09:15.572 --> 00:09:20.172 AI, 물리 연산, 블루프린트, 실행 등 135 00:09:20.172 --> 00:09:23.922 게임 로직과 관련된 작업을 분석하여 136 00:09:23.922 --> 00:09:26.222 최적화 포인트를 찾을 수가 있습니다 137 00:09:27.122 --> 00:09:30.022 근데 저희는 크게 한 게 없기 때문에 138 00:09:30.022 --> 00:09:32.522 블루프린트 로직이나 이런 걸 짠 게 없기 때문에 139 00:09:32.522 --> 00:09:36.722 지금은 크게 반응하지 않습니다 다시 끄고 140 00:09:39.372 --> 00:09:46.321 그다음은 Stat Slow 이 옵션 같은 경우에는 141 00:09:46.321 --> 00:09:50.271 성능 저하가 발생하는 작업들을 확인할 수 있습니다 142 00:09:50.271 --> 00:09:54.971 특정 작업이 예상보다 오래 걸리거나 반복되는 경우 143 00:09:54.971 --> 00:09:57.971 이를 통해 문제를 식별하고 해결할 수 있습니다 144 00:09:57.971 --> 00:10:01.421 말 그대로 가장 느려지는 부분들을 145 00:10:01.421 --> 00:10:06.021 확인할 수 있다고 보시면 될 것 같아요 다시 끄겠습니다 146 00:10:08.321 --> 00:10:20.821 그다음 옵션은 Stat SceneRendering이라고 합니다 147 00:10:20.821 --> 00:10:25.671 이 옵션은 신 렌더링에 대한 자세한 정보를 제공하게 됩니다 148 00:10:25.671 --> 00:10:30.121 여기에서는 드로우 콜의 수, 그림자의 계산 149 00:10:30.121 --> 00:10:32.121 라이트의 내역 등이 포함되며 150 00:10:32.121 --> 00:10:35.021 렌더링 단계에서 발생하는 151 00:10:35.021 --> 00:10:39.371 성능 병목 현상을 파악하는 데 큰 도움이 됩니다 152 00:10:40.271 --> 00:10:43.771 그리고 저희가 아까는 방금 보여드린 것처럼 153 00:10:43.771 --> 00:10:45.721 이렇게 끌 수 있겠지만 154 00:10:45.721 --> 00:10:47.421 여러 가지를 불러올 수 있어요 155 00:10:47.421 --> 00:10:58.321 Stat Unit, Stat SceneRendering, Stat Slow 156 00:10:58.321 --> 00:11:01.171 이렇게 다양하게 불러올 수 있는데 157 00:11:01.171 --> 00:11:05.321 Stat GAME 이런 식으로 불러올 수 있는데 158 00:11:05.321 --> 00:11:09.921 이걸 한 번에 끄기 위해서는 Stat None 159 00:11:09.921 --> 00:11:14.721 이렇게 하시면 한 번에 종료할 수 있고 편리합니다 160 00:11:16.871 --> 00:11:21.571 이번에는 최적화 뷰 모드에 대해서 설명드리도록 하겠습니다 161 00:11:21.571 --> 00:11:23.921 언리얼 엔진에서는 최적화를 위한 162 00:11:23.921 --> 00:11:26.321 다양한 뷰 모드를 제공하고 있습니다 163 00:11:26.321 --> 00:11:28.471 그 뷰 모드를 보기 위해서는 164 00:11:28.471 --> 00:11:31.271 이 부분에서 클릭하신 다음에 165 00:11:31.271 --> 00:11:35.821 여기 Optimization Viewmodes 아래에 이렇게 있습니다 166 00:11:35.821 --> 00:11:39.171 일단 첫 번째 옵션을 먼저 보게 되면 167 00:11:39.171 --> 00:11:42.471 이렇게 보시면 빨간색도 있고 흰색도 있고 168 00:11:42.471 --> 00:11:46.021 초록색도 있고 주황색도 있고 컬러가 좀 다양한데요 169 00:11:46.821 --> 00:11:49.271 이 부분들도 엄청 겹치고 있죠 170 00:11:49.271 --> 00:11:54.171 이 뷰 모드 같은 경우에는 신의 라이트 복잡도를 171 00:11:54.171 --> 00:11:57.421 시각화하는 뷰 모드라고 보시면 될 것 같아요 172 00:11:57.421 --> 00:12:00.721 이 모드는 신에 있는 각 라이트가 173 00:12:00.721 --> 00:12:03.321 얼마나 많은 비용을 차지하고 있는지 174 00:12:03.321 --> 00:12:06.021 색상으로 표현할 수가 있습니다 175 00:12:07.021 --> 00:12:12.671 왼쪽으로 가까운 색상을 띄고 있는 것일수록 176 00:12:12.671 --> 00:12:14.771 가벼운 비용을 나타내며 177 00:12:14.771 --> 00:12:19.271 노란색과 빨간색처럼 오른쪽으로 나타내고 있는 것은 178 00:12:19.271 --> 00:12:24.121 많은 성능을 필요로 하는 라이팅이라고 보시면 될 것 같습니다 179 00:12:24.121 --> 00:12:28.870 특히 라이트가 이렇게 많이 겹치는 부분에서는 180 00:12:28.870 --> 00:12:32.420 빨간색이나 보라색, 흰색으로 표시되며 181 00:12:32.420 --> 00:12:36.970 이 부분에 대해서는 최적화가 필요한 부분이라고 생각이 듭니다 182 00:12:38.170 --> 00:12:40.720 그다음에 대해서 설명드릴게요 183 00:12:40.720 --> 00:12:43.220 그 아래에 있는 Lightmap Density 184 00:12:44.520 --> 00:12:49.470 이 부분 같은 경우에는 라이트맵에 사용되는 밀도를 185 00:12:49.470 --> 00:12:52.520 시각화한 뷰 모드라고 보시면 될 것 같아요 186 00:12:52.520 --> 00:12:57.120 이것도 똑같이 초록색, 빨간색, 보라색 이렇게 있고 187 00:12:57.120 --> 00:12:59.070 컬러는 다양하게 있습니다 188 00:13:00.370 --> 00:13:04.670 색상으로 밀도를 표시하며 밀도가 너무 높거나 낮은 부분을 189 00:13:04.670 --> 00:13:08.070 쉽게 파악할 수 있는 그런 뷰 모드입니다 190 00:13:08.070 --> 00:13:11.670 이를 통해서 최적의 라이트맵 해상도를 설정하여 191 00:13:11.670 --> 00:13:16.120 조명 품질과 성능의 균형을 맞추는 데 큰 도움을 주게 됩니다 192 00:13:18.120 --> 00:13:25.370 선택하게 되면 라이트맵 밀도를 확인할 수가 있습니다 193 00:13:27.320 --> 00:13:31.670 Stationary Light Overlap 이 뷰 모드가 될 경우에는 194 00:13:31.670 --> 00:13:37.670 지금은 안 보이게 되지만 설명을 드리자면 195 00:13:37.670 --> 00:13:43.420 이 뷰 모드는 Stationary Light가 겹치는 구간을 시각화합니다 196 00:13:43.420 --> 00:13:48.220 Stationary Light는 한 지점에 고정된 조명을 제공하는데 197 00:13:48.220 --> 00:13:52.620 여러 개의 Stationary Light가 동일한 영역에 겹쳐질 경우 198 00:13:52.620 --> 00:13:55.520 성능의 비용이 매우 높아질 수가 있습니다 199 00:13:56.670 --> 00:14:00.470 그 아래에 있는 옵션에 대해서 설명을 드리겠습니다 200 00:14:00.470 --> 00:14:03.420 Shader Complexity 201 00:14:05.420 --> 00:14:11.270 이 뷰 모드는 GPU가 계산하는 쉐이더의 복잡도를 시각화하여 202 00:14:11.270 --> 00:14:17.070 각 픽셀이 얼마나 복잡한 계산을 수행하고 있는지 보여줍니다 203 00:14:17.070 --> 00:14:20.570 파티클 같은 경우에는 빨간색으로 보이게 되죠 204 00:14:21.120 --> 00:14:25.070 쉐이더가 복잡하면 복잡할수록 색상은 205 00:14:25.070 --> 00:14:29.170 초록색에서 흰색으로 나타나게 됩니다 206 00:14:29.170 --> 00:14:32.020 빨간색이나 흰색으로 표시된 영역은 207 00:14:32.020 --> 00:14:35.020 쉐이더가 매우 복잡한 부분이므로 208 00:14:35.020 --> 00:14:41.570 렉이 걸린다 하면 그 부분들에 대해서 최적화를 해야 합니다 209 00:14:44.570 --> 00:14:50.520 파티클에서도 많이 그럴 거고 지금도 깨진 창문 이쪽 라인 210 00:14:50.520 --> 00:14:54.020 그리고 바닥에 이런 부분들은 사실 211 00:14:54.020 --> 00:14:56.470 텍스처로 그냥 대체하기 때문에 212 00:14:56.470 --> 00:15:00.570 크게 복잡하지 않고 바로 이런 퀄리티를 낼 수 있습니다 213 00:15:02.370 --> 00:15:07.320 그 아래에 있는 옵션에 대해서 설명을 드리자면 214 00:15:07.320 --> 00:15:13.020 이 모드는 쉐이더의 복잡도와 쿼드 오버드로우를 215 00:15:13.020 --> 00:15:15.819 동시에 같이 시각화할 수 있습니다 216 00:15:15.819 --> 00:15:21.219 쉐이더 복잡도와 픽셀당 쿼드 오버드로우의 정보를 217 00:15:21.219 --> 00:15:25.469 합쳐서 보여줌으로써 쉐이더의 복잡성뿐만 아니라 218 00:15:25.469 --> 00:15:29.669 각 픽셀의 렌더링 효율을 한눈에 파악할 수 있습니다 219 00:15:29.669 --> 00:15:32.969 쉐이더가 복잡하거나 오버드로우가 높은 부분은 220 00:15:32.969 --> 00:15:36.869 성능 최적화가 필요로 하게 됩니다 221 00:15:36.869 --> 00:15:40.319 이제 Quad Overdraw에 대해서 설명을 드리자면 222 00:15:43.519 --> 00:15:45.969 이 뷰 모드 같은 경우에는 223 00:15:45.969 --> 00:15:49.969 오버드로우가 발생하는 부분을 시각화할 수 있습니다 224 00:15:49.969 --> 00:15:54.569 오버드로우는 동일한 픽셀이 여러 번 그려지는 현상을 의미하며 225 00:15:54.569 --> 00:15:58.369 이는 성능 저하의 주요 원인 중 하나입니다 226 00:15:59.419 --> 00:16:03.119 Quad Overdraw 뷰 모드는 이를 시각화하여 227 00:16:03.119 --> 00:16:06.719 불필요한 렌더링 작업을 줄일 수 있도록 도와주게 됩니다 228 00:16:06.719 --> 00:16:10.819 특히 인스턴싱을 사용하거나 Mesh를 병합하여 229 00:16:10.819 --> 00:16:13.369 오버드로우를 줄여주시는 것도 230 00:16:13.369 --> 00:16:15.369 최적화의 방법이 될 수 있습니다 231 00:16:17.419 --> 00:16:21.869 이런 식으로 뷰 모드를 활용하여 어디서 렉이 걸리고 232 00:16:21.869 --> 00:16:25.869 어떤 부분에서 렉이 걸리고 성능 저하가 이루어지는지 233 00:16:25.869 --> 00:16:27.569 시각적으로 확인을 할 수 있고 234 00:16:27.569 --> 00:16:33.569 아까 제가 말씀드린 Stat 명령어를 통해서 235 00:16:33.569 --> 00:16:38.169 성능 저하가 어디서 일어나는지를 확인할 수가 있습니다 236 00:16:38.769 --> 00:16:43.669 우선 이전에 저희가 어디서 병목 현상이 발생하고 237 00:16:43.669 --> 00:16:46.419 어디서 렉이 발생하는지에 대해서 238 00:16:46.419 --> 00:16:49.019 확인을 하는 방법에 대해서 알아봤습니다 239 00:16:49.019 --> 00:16:54.519 이번에는 최적화를 하는 방법에 대해서 설명드리겠습니다 240 00:16:54.519 --> 00:16:59.019 일단 첫 번째로는 LOD를 활용한 최적화 방법이 있겠죠 241 00:16:59.019 --> 00:17:04.469 LOD란 무엇인가? LOD는 Level of Detail의 약자입니다 242 00:17:04.469 --> 00:17:07.969 LOD 시스템을 적용하여 전체 Scene과 개별 Mesh의 243 00:17:07.969 --> 00:17:10.069 불필요한 면을 제거함으로써 244 00:17:10.069 --> 00:17:12.369 최적화 작업을 진행할 수 있습니다 245 00:17:12.369 --> 00:17:15.769 LOD는 오브젝트의 거리나 중요도에 따라 246 00:17:15.769 --> 00:17:17.869 디테일 수준을 조절하여 247 00:17:17.869 --> 00:17:24.119 멀면 LOD4, 가까우면 LOD0까지 이렇게 조절하여 248 00:17:24.119 --> 00:17:27.569 GPU와 메모리 사용량을 줄여줄 수 있습니다 249 00:17:28.169 --> 00:17:32.669 보시는 사진과 같이 LOD0부터 LOD4까지 250 00:17:32.669 --> 00:17:35.319 총 5가지 단계가 있습니다 251 00:17:35.319 --> 00:17:39.669 단계가 높아지면 높아질수록 삼각형 수가 줄어듦으로써 252 00:17:39.669 --> 00:17:41.669 오브젝트가 간단해집니다 253 00:17:41.669 --> 00:17:44.469 예를 들어 오브젝트를 보시게 되면 254 00:17:44.469 --> 00:17:48.619 LOD0에서는 16,128개의 면이 있지만 255 00:17:48.619 --> 00:17:53.069 LOD4까지 가면 48개로 간소화하게 됩니다 256 00:17:54.369 --> 00:17:59.319 이로써 LOD를 사용하여 가까운 곳에서는 높은 디테일 0번 257 00:17:59.319 --> 00:18:01.818 멀리 있을수록 낮은 디테일 4번 258 00:18:01.818 --> 00:18:04.268 중간에는 LOD2가 될 수도 있고 259 00:18:04.268 --> 00:18:07.318 어느 특정 거리에 가면 LOD3이 될 수도 있고 260 00:18:07.318 --> 00:18:10.618 이를 통해서 불필요한 리소스 사용을 줄여 261 00:18:10.618 --> 00:18:12.868 성능을 높일 수 있습니다 262 00:18:12.868 --> 00:18:18.968 아래도 같은 LOD0, LOD1, LOD2 등을 표현할 수 있습니다 263 00:18:22.318 --> 00:18:27.718 사진을 보시게 되면 LOD0부터 LOD4까지 설정되어 있고 264 00:18:27.718 --> 00:18:30.918 가까이에서는 고해상도의 LOD0이 사용되고 265 00:18:30.918 --> 00:18:34.875 멀리 있을수록 단순한 LOD4가 사용됩니다 266 00:18:35.768 --> 00:18:44.518 LOD를 만들기 위해서는 MAYA나 블렌더, 3D MAX 267 00:18:44.518 --> 00:18:47.218 이런 툴에서 LOD 그룹을 만들어서 268 00:18:47.218 --> 00:18:49.968 LOD0 Mesh랑 LOD1 Mesh 269 00:18:49.968 --> 00:18:53.268 LOD2 Mesh, LOD3 Mesh, LOD4 Mesh 270 00:18:53.268 --> 00:18:56.668 이런 식으로 만들어서 LOD 그룹으로 만들어주게 되면 271 00:18:56.668 --> 00:18:59.018 이 파일을 FBX로 뽑아서 272 00:18:59.018 --> 00:19:02.668 언리얼 자체에서는 FBX를 Import 할 때 273 00:19:02.668 --> 00:19:07.968 Import 옵션에 보시면 Import Mesh LODs라고 있습니다 274 00:19:07.968 --> 00:19:11.218 이 부분을 체크하게 되시면 275 00:19:11.218 --> 00:19:19.068 아까 저희가 이전에 설정했던 LOD0, 1, 2, 3, 4 등이 276 00:19:19.068 --> 00:19:21.218 자동으로 불러와지게 됩니다 277 00:19:21.218 --> 00:19:24.168 이 과정을 통해 성능을 최적화하면서도 278 00:19:24.168 --> 00:19:26.818 필요한 디테일을 유지할 수가 있습니다 279 00:19:29.118 --> 00:19:34.468 또한 다각형 수 감소라는 최적화 방법이 있습니다 280 00:19:34.468 --> 00:19:39.318 각 Mesh의 불필요한 다각형 수를 줄여 최적화를 합니다 281 00:19:39.318 --> 00:19:41.568 너무 높은 폴리곤 모델 대신에 282 00:19:41.568 --> 00:19:43.918 적절한 다각형 수를 유지하여 283 00:19:43.918 --> 00:19:46.368 효율적인 렌더링을 할 수 있도록 합니다 284 00:19:46.368 --> 00:19:48.868 사실 이 부분의 최적화 같은 경우에는 285 00:19:48.868 --> 00:19:52.918 모델링에 필요 없는 면이나 필요 없는 선 286 00:19:52.918 --> 00:19:56.768 필요 없는 것들에 대해서 정리를 필요로 합니다 287 00:19:56.768 --> 00:20:01.118 그다음으로는 불필요한 오브젝트 제거입니다 288 00:20:02.068 --> 00:20:04.518 언리얼 화면에서 보시게 되면 289 00:20:04.518 --> 00:20:07.418 플레이어가 볼 수 없는 곳에 290 00:20:07.418 --> 00:20:10.418 오브젝트나 사용하지 않는 요소들이 291 00:20:10.418 --> 00:20:12.518 Scene에서 제거를 하게 되어 292 00:20:12.518 --> 00:20:15.168 렌더링 오버드로우를 줄이게 됩니다 293 00:20:15.168 --> 00:20:19.868 ICVFX나 이런 카메라를 통해 렌더링을 진행하는데 294 00:20:19.868 --> 00:20:24.918 불필요한 곳에 라이팅이 있다든지 Mesh가 있다든지 295 00:20:24.918 --> 00:20:29.068 그런 부분들에 대해서도 정리를 해주게 되면 296 00:20:29.068 --> 00:20:34.168 성능 저하나 렉을 줄이는 방법이 될 수 있습니다 297 00:20:35.518 --> 00:20:39.968 그다음으로는 일단 Stat Unit로 가보겠습니다 298 00:20:40.818 --> 00:20:42.268 드로우 콜 수라고 있죠? 299 00:20:42.268 --> 00:20:46.767 저희가 지금 3000개의 삼각형을 보고 있는 건데 300 00:20:48.917 --> 00:20:51.667 일단 오브젝트 병합이라는 방법이 있습니다 301 00:20:51.667 --> 00:20:54.617 지금은 이런 식으로 다 뜯어져 있긴 합니다 302 00:20:55.367 --> 00:20:59.517 이런 작은 Mesh들을 병합하여 드로우 콜 수를 줄이고 303 00:20:59.517 --> 00:21:02.367 성능을 향상시킬 수 있습니다 304 00:21:02.367 --> 00:21:06.567 이게 하나의 드로우 콜, 하나의 드로우 콜 305 00:21:06.567 --> 00:21:08.567 이런 것들을 합쳐가지고 306 00:21:08.567 --> 00:21:12.017 조금 더 작은 드로우 콜 수로 계산해서 307 00:21:12.017 --> 00:21:13.767 확인할 수가 있습니다 308 00:21:14.567 --> 00:21:17.817 그리고 그다음 방법에 대해서 설명을 드리자면 309 00:21:17.817 --> 00:21:23.617 서브 레벨의 개념입니다 서브 레벨을 하나 만들어 볼게요 310 00:21:23.617 --> 00:21:29.267 콘텐츠에 폴더를 만들고 sub_level 311 00:21:29.817 --> 00:21:34.367 그리고 이 아래에 레벨을 만드신 다음에 312 00:21:34.367 --> 00:21:40.317 라이팅 레벨을 만드신 다음에 저장해 주시고 313 00:21:40.317 --> 00:21:42.217 여기다가 라이팅을 넣게 되시면 314 00:21:42.217 --> 00:21:44.817 사실 이렇게 껐다 켜도 아무 변화가 없어요 315 00:21:44.817 --> 00:21:48.067 이 레벨에 아무것도 존재하지 않기 때문이죠 316 00:21:48.067 --> 00:21:51.067 일단 Persistent Level로 돌아가신 다음에 317 00:21:53.267 --> 00:21:56.117 여기서 라이팅을 검색해 보겠습니다 318 00:21:56.117 --> 00:22:03.017 라이트가 지금 다섯 개 이걸 껐을 때 이렇게 보이게 될 건데 319 00:22:04.567 --> 00:22:06.267 여기로 가서 보겠습니다 320 00:22:07.517 --> 00:22:11.217 지금은 라이트맵이 구워져 있어서 이렇게 보이지만 321 00:22:14.017 --> 00:22:16.867 이 라이트들을 이제 이 레벨에 넣게 될 건데 322 00:22:16.867 --> 00:22:19.217 넣는 방법에 대해서는 323 00:22:19.217 --> 00:22:21.517 이 라이트들을 선택하신 다음에 324 00:22:21.517 --> 00:22:26.217 라이팅 레벨의 서브 레벨을 우클릭 하셔가지고 325 00:22:26.217 --> 00:22:32.367 Move Selected Actors to Level을 클릭하게 되시면 326 00:22:34.217 --> 00:22:38.517 라이팅 오브젝트들은 이 라이팅 레벨에 들어가 있어서 327 00:22:38.517 --> 00:22:40.667 라이팅 레벨을 끄시게 되면 328 00:22:40.667 --> 00:22:43.517 이런 식으로 조절을 할 수가 있어서 329 00:22:43.517 --> 00:22:48.367 이 서브 레벨을 통해서 라이팅 레벨을 따로 주시고 330 00:22:48.367 --> 00:22:53.367 그리고 레벨을 제작할 때 구역을 나눠주게 될 텐데 331 00:22:57.567 --> 00:23:04.617 이쪽에 한 구역, 이쪽에 이 구역 이런 식으로 나눠가지고 332 00:23:04.617 --> 00:23:08.067 서브 레벨로 배치를 할 수도 있습니다 333 00:23:10.817 --> 00:23:14.467 그리고 그다음 방식에 대해서 설명을 드리도록 하겠습니다 334 00:23:17.567 --> 00:23:26.567 일단 이 Static Mesh를 안쪽으로 들어가서 보시게 되면 335 00:23:26.567 --> 00:23:30.817 이제 LOD 그룹에 대해서 설명을 드리도록 하겠습니다 336 00:23:35.166 --> 00:23:37.866 아래에 보시면 LOD 그룹이라는 게 있습니다 337 00:23:37.866 --> 00:23:42.266 이 LOD 그룹은 Mesh가 특정 그룹에 속하는 경우 338 00:23:42.266 --> 00:23:46.116 자동으로 언리얼에서 계산한 339 00:23:46.116 --> 00:23:48.916 적절한 LOD 설정을 적용하도록 도와주는 340 00:23:48.916 --> 00:23:51.116 기능이라고 생각하시면 될 것 같습니다 341 00:23:51.116 --> 00:23:55.266 언리얼이 자체적으로 오브젝트의 크기나 특성에 맞는 342 00:23:55.266 --> 00:23:58.816 LOD 거리와 품질을 미리 정의해 놓아서 343 00:23:58.816 --> 00:24:01.816 개발자가 직접 LOD를 하나하나 세팅하지 않아도 344 00:24:01.816 --> 00:24:03.666 쉽게 최적화가 가능합니다 345 00:24:03.666 --> 00:24:07.916 이 부분 같은 경우는 Foliage를 사용했기 때문에 346 00:24:07.916 --> 00:24:09.666 Foliage를 선택하게 되시면 347 00:24:09.666 --> 00:24:13.416 Foliage에 맞는 LOD 계산값들이 들어가게 될 겁니다 348 00:24:14.516 --> 00:24:16.216 그리고 이 부분에 대해서 349 00:24:16.216 --> 00:24:18.016 이런 식으로 그룹으로 나눠놨지만 350 00:24:18.016 --> 00:24:22.016 그래도 렉이 걸리고 좀 불필요한 경우가 있다 351 00:24:22.016 --> 00:24:26.566 이럴 때 LOD를 수동으로 조절할 수가 있습니다 352 00:24:28.516 --> 00:24:31.966 LOD를 수동으로 조절하는 곳에는 353 00:24:31.966 --> 00:24:35.116 이 위에 /토글 버튼을 누르시게 되면 354 00:24:35.116 --> 00:24:38.066 이런 옵션들이 보이게 될 텐데 355 00:24:38.066 --> 00:24:45.316 Percent Triangles 값을 조절해서 몇 퍼센트 수준으로 사용할지 356 00:24:45.316 --> 00:24:49.516 그런 것을 조절할 수 있는 옵션이라고 보시면 될 것 같아요 357 00:24:49.516 --> 00:24:54.966 이를 통해서 LOD1 또는 LOD2에서 358 00:24:54.966 --> 00:24:58.766 폴리곤 수를 적절히 줄여 최적화가 가능하게 됩니다 359 00:24:58.766 --> 00:25:02.516 그래서 이 부분이 지금은 100%라고 볼 수 있는데 360 00:25:02.516 --> 00:25:07.216 이 부분을 보여드리자면 이런 식으로 100%인데 361 00:25:07.216 --> 00:25:11.666 이 부분을 50%로 줄여가지고 보겠다 362 00:25:11.666 --> 00:25:16.366 바꾸고 나서 Apply Changes를 꼭 눌러주셔야 변경이 됩니다 363 00:25:16.366 --> 00:25:21.216 그래서 이 부분은 트라이앵글 50%로 읽는 364 00:25:21.216 --> 00:25:23.775 그런 뜻이라고 보시면 될 것 같아요 365 00:25:24.916 --> 00:25:28.866 그다음 방법으로는 나나이트를 이용한 최적화입니다 366 00:25:28.866 --> 00:25:32.816 나나이트는 언리얼 엔진에서 복잡한 모델의 디테일을 367 00:25:32.816 --> 00:25:36.316 효율적으로 처리하기 위해 개발된 기술로 368 00:25:36.316 --> 00:25:38.616 인식할 수 있는 디테일만 처리하여 369 00:25:38.616 --> 00:25:40.866 성능을 최적화할 수 있습니다 370 00:25:40.866 --> 00:25:46.066 기능으로는 기존에는 거리별로 LOD를 설정하였지만 371 00:25:46.066 --> 00:25:50.316 나나이트를 활용하여 자동으로 처리해주기 때문에 372 00:25:50.316 --> 00:25:52.966 사전 LOD 작업이 필요가 없습니다 373 00:25:52.966 --> 00:25:54.866 이를 통해 멀리 있는 객체는 374 00:25:54.866 --> 00:25:59.166 자동으로 로우폴리로 변환하여 렌더링 부하를 줄이고 375 00:25:59.166 --> 00:26:03.016 가까이 있는 객체는 자동으로 하이폴리 수준의 Mesh로 변경되어 376 00:26:03.016 --> 00:26:06.216 섬세한 표현이 가능하며 최적화가 가능합니다 377 00:26:06.216 --> 00:26:10.016 나나이트를 활성화하기 위해서는 두 가지 방식이 있는데요 378 00:26:10.016 --> 00:26:13.766 이 애셋을 콘텐츠 브라우저에서 우클릭하신 다음에 379 00:26:13.766 --> 00:26:17.166 나나이트에서 Enable Nanite를 하시거나 380 00:26:17.166 --> 00:26:20.515 더블 클릭하셔서 디테일 모드로 들어가신 다음에 381 00:26:20.515 --> 00:26:23.665 이 디테일에 나나이트 세팅이 있습니다 382 00:26:23.665 --> 00:26:27.165 Enable Nanite Support 체크를 해주신 다음에 383 00:26:27.165 --> 00:26:31.015 Apply Changes를 눌러주시면 384 00:26:31.015 --> 00:26:34.415 나나이트로 변경되어 활용할 수가 있습니다 385 00:26:34.415 --> 00:26:38.565 그리고 나나이트 뷰 모드를 보기 위함이 있는데요 386 00:26:38.565 --> 00:26:41.465 Lit 버튼을 누르시게 되면 나나이트 387 00:26:41.465 --> 00:26:44.315 이 부분에서 Triangles를 누르시게 되면 388 00:26:44.315 --> 00:26:48.765 지금 나나이트로 설정된 Mesh들을 볼 수가 있습니다 389 00:26:48.765 --> 00:26:51.415 지금은 면 개수가 이렇게 보이지만 390 00:26:51.415 --> 00:26:55.215 멀어지면 멀어질수록 이 트라이앵글들이 점점 커져서 391 00:26:55.215 --> 00:26:59.165 GPU가 계산하는 값이 줄어들게 될 겁니다 392 00:27:03.315 --> 00:27:05.265 이번에는 텍스처 맵을 이용한 393 00:27:05.265 --> 00:27:08.815 폴리곤 최적화 방식에 대해서 알려드리도록 하겠습니다 394 00:27:08.815 --> 00:27:13.915 우선은 Normal Map을 활용한 폴리곤 최적화 방식입니다 395 00:27:13.915 --> 00:27:16.265 위쪽에 보이는 이미지를 보시게 되면 396 00:27:16.265 --> 00:27:19.565 각기 다른 폴리곤 수를 가진 구체들이 있습니다 397 00:27:19.565 --> 00:27:23.565 고해상도의 디테일을 표현하려면 폴리곤 수가 늘어나지만 398 00:27:23.565 --> 00:27:26.665 이는 성능에 부담을 줄 수가 있습니다 399 00:27:26.665 --> 00:27:30.815 아래쪽 그림은 Mesh의 Normal 원리를 보여주게 됩니다 400 00:27:30.815 --> 00:27:32.565 이 Normal을 Bake하여 401 00:27:32.565 --> 00:27:35.265 각 표현의 법선 방향을 기록하여 402 00:27:35.265 --> 00:27:38.665 이 맵을 이용하여 로우폴리 모델에서도 403 00:27:38.665 --> 00:27:41.415 디테일이 있는 것처럼 보이게 할 수 있습니다 404 00:27:41.415 --> 00:27:46.665 이를 활용하여 적은 폴리곤으로 마치 고해상도의 Mesh처럼 405 00:27:46.665 --> 00:27:49.165 입체적인 느낌을 줄 수 있습니다 406 00:27:53.115 --> 00:27:55.265 왼쪽 이미지를 보시게 되면 407 00:27:55.265 --> 00:27:58.615 비교적 적은 면을 가진 모델에서는 법선 벡터가 408 00:27:58.615 --> 00:28:02.515 각 면의 중심으로 뻗어 나오는 것을 볼 수 있습니다 409 00:28:02.515 --> 00:28:06.115 이와 달리 오른쪽 이미지 같은 구조에는 410 00:28:06.115 --> 00:28:07.665 더 많은 면을 추가하여 411 00:28:07.665 --> 00:28:11.615 각 면에 더 많은 법선 벡터가 생성된 상태입니다 412 00:28:11.615 --> 00:28:13.615 이렇게 면의 개수가 많아지면 413 00:28:13.615 --> 00:28:17.015 법선 방향이 더욱 세밀하게 표현이 되지만 414 00:28:17.015 --> 00:28:20.715 폴리곤 수가 늘어나면서 성능에 부담이 될 수도 있습니다 415 00:28:21.165 --> 00:28:22.615 이를 해결하기 위해 416 00:28:22.615 --> 00:28:26.415 추가적인 폴리곤 없이도 디테일을 표현하기 위해 417 00:28:26.415 --> 00:28:29.615 Normal Map을 사용하는 것이 효과적입니다 418 00:28:29.615 --> 00:28:32.915 Normal Map을 사용하면 법선 정보를 텍스처에 담아 419 00:28:32.915 --> 00:28:37.715 실제로 면을 늘리지 않고도 디테일을 추가할 수 있습니다 420 00:28:37.715 --> 00:28:39.165 사진을 보시게 되면 421 00:28:39.165 --> 00:28:43.915 동일한 288개의 폴리곤 수를 가진 두 구체가 있습니다 422 00:28:43.915 --> 00:28:48.365 왼쪽 구체는 각 면이 명확하게 드러나는 로우폴리 모델이고 423 00:28:48.365 --> 00:28:50.265 오른쪽은 Normal Map을 적용하여 424 00:28:50.265 --> 00:28:53.865 고해상도처럼 보이게 만든 로우폴리 모델입니다 425 00:28:53.865 --> 00:28:57.715 오른쪽 구체는 실제로는 폴리곤 수가 적지만 426 00:28:57.715 --> 00:28:58.865 Normal Map을 통해 427 00:28:58.865 --> 00:29:02.915 하이폴리와 같은 Mesh 형태를 가지게 되었습니다 428 00:29:02.915 --> 00:29:05.164 그 오른쪽에 있는 다이어그램을 통해 429 00:29:05.164 --> 00:29:07.464 이 과정을 좀 더 이해해보자면 430 00:29:07.464 --> 00:29:11.514 맨 위에 로우폴리 모델은 디테일이 부족하고 431 00:29:11.514 --> 00:29:14.164 법선 방향이 단순합니다 432 00:29:14.164 --> 00:29:18.114 가운데 하이폴리 모델은 복잡한 곡선을 가지고 있어 433 00:29:18.114 --> 00:29:22.114 법선 방향이 더 세밀하게 정의가 되어 있습니다 434 00:29:22.114 --> 00:29:24.014 Normal Map Baking 과정에서는 435 00:29:24.014 --> 00:29:28.564 이 하이폴리 법선 정보를 로우폴리 모델에 Baking하여 436 00:29:28.564 --> 00:29:32.664 로우폴리 모델이 실제로는 적은 폴리곤을 가졌지만 437 00:29:32.664 --> 00:29:38.014 마치 하이폴리처럼 복잡한 디테일을 가진 것처럼 보이게 합니다 438 00:29:38.014 --> 00:29:42.014 이를 통해서 로우폴리에 Normal Map을 적용시키면 439 00:29:42.014 --> 00:29:44.264 추가적인 면 추가 없이 440 00:29:44.264 --> 00:29:48.764 디테일이 있는 것처럼 Mesh를 만들 수 있습니다 441 00:29:53.664 --> 00:29:57.214 하이폴리 Baking을 통해 442 00:29:57.214 --> 00:30:01.164 두 번째에 있는 Mesh에 세 번째의 Normal을 입히게 되면 443 00:30:01.164 --> 00:30:06.064 최종적으로 1번과 같은 시각적 디테일을 얻을 수 있습니다 444 00:30:08.364 --> 00:30:11.764 다음은 Mask Map을 이용한 최적화 방법에 대해서 445 00:30:11.764 --> 00:30:13.514 설명드리도록 하겠습니다 446 00:30:14.614 --> 00:30:17.214 왼쪽 이미지를 보시게 되면 447 00:30:17.214 --> 00:30:21.714 철망 같은 펜스 디테일이 들어가 있는 448 00:30:21.714 --> 00:30:23.764 투명한 형태로 보이게 됩니다 449 00:30:23.764 --> 00:30:29.114 만약 이 철망 같은 Mesh를 하나하나 모델링 하게 되면 450 00:30:29.114 --> 00:30:33.714 면의 개수도 많아지고 작업시간이 크게 증가할 것으로 보입니다 451 00:30:33.714 --> 00:30:36.214 철망 구조를 폴리곤으로 모두 표현하려면 452 00:30:36.214 --> 00:30:38.814 복잡한 모델링 작업을 필요로 하며 453 00:30:38.814 --> 00:30:42.214 이는 성능에 큰 부담이 될 수도 있습니다 454 00:30:42.214 --> 00:30:45.114 오른쪽 이미지처럼 언리얼 엔진에서는 455 00:30:45.114 --> 00:30:48.314 머티리얼 에디터에서 Mask Map을 사용하면 456 00:30:48.314 --> 00:30:53.564 철망 부분만 표시하고 나머지 부분은 투명하게 처리할 수 있습니다 457 00:30:53.564 --> 00:30:57.014 이를 통해 추가적인 폴리곤을 사용하지 않고도 458 00:30:57.014 --> 00:31:00.964 철망의 빈 공간을 사실적으로 표현할 수 있습니다 459 00:31:00.964 --> 00:31:02.814 이와 같이 Mask Map을 사용하면 460 00:31:02.814 --> 00:31:05.314 작업시간이 단축될 뿐만 아니라 461 00:31:05.314 --> 00:31:09.314 폴리곤 수를 줄여 성능을 최적화하는 데도 매우 효과적입니다 462 00:31:12.264 --> 00:31:18.314 그 외에도 사진과 같이 Mask Map을 이용하여 463 00:31:19.364 --> 00:31:22.764 찢어진 천이라든지 특히 나뭇잎을 표현할 때 464 00:31:22.764 --> 00:31:24.764 가장 많이 사용하기도 합니다 465 00:31:24.764 --> 00:31:29.564 나뭇잎을 Mesh로 표현하게 되면 466 00:31:29.564 --> 00:31:32.114 정말 많은 디테일들을 표현하려면 467 00:31:32.114 --> 00:31:34.664 많은 면들도 필요하게 될 거고 468 00:31:34.664 --> 00:31:39.864 하지만 이 나뭇잎들도 되게 많은 개수의 나뭇잎이 필요할 텐데 469 00:31:39.864 --> 00:31:42.164 이런 부분들에 대해서는 Mask Map을 쓰는 게 470 00:31:42.164 --> 00:31:44.264 정말 중요하다고 생각합니다 471 00:31:47.064 --> 00:31:51.963 다음은 머티리얼 최적화에 대해서 설명드리도록 하겠습니다 472 00:31:51.963 --> 00:31:56.013 머티리얼을 최적화해 불필요한 텍스처를 제거하고 473 00:31:56.013 --> 00:31:59.263 텍스처 해상도를 낮춰 메모리 사용을 줄입니다 474 00:31:59.263 --> 00:32:01.613 또한 사용하지 않는 머티리얼을 제거하여 475 00:32:01.613 --> 00:32:03.813 퍼포먼스를 높일 수가 있습니다 476 00:32:03.813 --> 00:32:08.063 머티리얼 복잡도는 GPU 부하에 큰 영향을 주므로 477 00:32:08.063 --> 00:32:09.813 주의가 필요합니다 478 00:32:12.113 --> 00:32:14.613 이 사진을 보시게 되면 이 Mesh에는 479 00:32:14.613 --> 00:32:17.513 7개의 머티리얼 슬롯이 있습니다 480 00:32:17.513 --> 00:32:21.013 우드도 있고, 콘크리트도 있고, 페이퍼도 있고 481 00:32:21.013 --> 00:32:24.763 각 슬롯마다 서로 다른 머티리얼을 적용할 수가 있는데 482 00:32:24.763 --> 00:32:26.213 이렇게 슬롯이 많을 경우 483 00:32:26.213 --> 00:32:29.713 각각 머티리얼에 대해 드로우 콜이 발생합니다 484 00:32:29.713 --> 00:32:34.363 즉, 이 하나의 Mesh에 7개의 머티리얼 슬롯이 있다면 485 00:32:34.363 --> 00:32:38.413 이 한 개의 Mesh에 7개의 드로우 콜이 발생하는 것입니다 486 00:32:38.413 --> 00:32:40.963 이처럼 많은 머티리얼 슬롯을 사용하면 487 00:32:40.963 --> 00:32:44.713 드로우 콜 수가 늘어나 성능에 부담을 줄 수 있어 488 00:32:44.713 --> 00:32:48.913 최적화를 위해 슬롯을 줄이는 것도 방법이 있습니다 489 00:32:50.663 --> 00:32:54.163 이번에는 머티리얼 인스턴스 사용인데요 490 00:32:55.663 --> 00:32:57.213 기본 머티리얼을 바탕으로 491 00:32:57.213 --> 00:33:01.113 사진과 같은 2개의 인스턴스를 만들었습니다 492 00:33:01.113 --> 00:33:03.263 인스턴스를 사용하게 되면 493 00:33:03.263 --> 00:33:05.863 같은 기본 머티리얼을 공유하면서도 494 00:33:05.863 --> 00:33:09.013 색상이나 질감을 다르게 적용할 수 있습니다 495 00:33:09.013 --> 00:33:12.213 오른쪽 이미지를 보듯이 나뭇잎 2개에는 496 00:33:12.213 --> 00:33:15.063 모두 같은 기본 머티리얼을 사용하면서도 497 00:33:15.063 --> 00:33:17.763 각기 다른 색상으로 표현이 되었습니다 498 00:33:17.763 --> 00:33:20.763 이 방식도 최적화 방식 중 하나입니다 499 00:33:20.763 --> 00:33:25.413 기본 마스터 머티리얼 하나로 여러 개의 인스턴스를 생성하면 500 00:33:25.413 --> 00:33:27.513 각기 다른 머티리얼을 사용할 때보다 501 00:33:27.513 --> 00:33:31.713 메모리 사용량과 드로우 콜 수를 줄일 수 있습니다 502 00:33:36.563 --> 00:33:39.063 그다음 머티리얼 최적화 방식은 503 00:33:39.063 --> 00:33:42.163 데칼을 이용한 최적화 방식이 있습니다 504 00:33:42.163 --> 00:33:45.763 데칼 표현에 그림이나 텍스처를 입히는 방식으로 505 00:33:45.763 --> 00:33:48.963 개별 Mesh에 직접적인 텍스처를 추가하지 않고도 506 00:33:48.963 --> 00:33:52.813 장면에 다양한 디테일을 쉽게 추가할 수 있습니다 507 00:33:52.813 --> 00:33:56.863 이미지를 보시게 되면 바닥에 맨홀 표현이 되어 있습니다 508 00:33:56.863 --> 00:33:59.563 만약 이 디테일을 각각 Mesh로 만든 뒤 509 00:33:59.563 --> 00:34:01.563 텍스처를 만들어 넣었다면 510 00:34:01.563 --> 00:34:03.613 메모리와 드로우 콜이 증가하여 511 00:34:03.613 --> 00:34:06.113 성능에 큰 부담이 되었을 것입니다 512 00:34:06.113 --> 00:34:08.263 하지만 데칼을 이용하여 513 00:34:08.263 --> 00:34:11.113 추가적인 Mesh나 텍스처 없이 514 00:34:11.113 --> 00:34:13.963 필요한 부분에만 그래픽을 입힐 수 있고 515 00:34:13.963 --> 00:34:16.313 성능을 향상시킬 수 있습니다 516 00:34:16.313 --> 00:34:18.913 따라서 데칼을 활용하게 되면 517 00:34:18.913 --> 00:34:20.813 디테일을 효율적으로 추가하면서도 518 00:34:20.813 --> 00:34:24.013 성능을 최적화할 수 있고 519 00:34:24.013 --> 00:34:28.513 특히 복잡한 장면에서도 정말 유용한 방법이라고 생각됩니다 520 00:34:30.513 --> 00:34:32.813 이번에는 서브 레벨을 이용한 521 00:34:32.813 --> 00:34:36.962 레벨 스트리밍 최적화에 대해서 설명드리도록 하겠습니다 522 00:34:36.962 --> 00:34:43.462 이전에도 라이팅을 서브 레벨로 최적화하는 방식을 설명드렸지만 523 00:34:44.312 --> 00:34:47.262 더 자세히 설명을 드리자면 524 00:34:47.262 --> 00:34:50.962 서브 레벨 스트리밍을 사용하여 환경 제작에 있어 525 00:34:50.962 --> 00:34:55.462 필요한 레벨만 온오프 시키며 필요 없는 구역은 언로드해서 526 00:34:55.462 --> 00:34:57.812 메모리 사용량과 로딩 시간을 줄이고 527 00:34:57.812 --> 00:34:59.812 성능을 높일 수가 있습니다 528 00:34:59.812 --> 00:35:02.812 저희가 이렇게 작업을 하고 있다가 529 00:35:02.812 --> 00:35:06.762 지금은 이런 풀들을 따로 작업을 할 건 아닌데 530 00:35:06.762 --> 00:35:08.712 이런 큰 프랍들을 수정할 건데 531 00:35:08.712 --> 00:35:12.662 이런 작은 풀들이 있다고 했을 때 532 00:35:12.662 --> 00:35:14.962 리소스를 많이 잡아먹게 될 거잖아요 533 00:35:14.962 --> 00:35:17.262 이 부분들에 대해서 눈을 534 00:35:17.262 --> 00:35:19.462 제가 leaf를 따로 나눠 놨어요 535 00:35:19.462 --> 00:35:23.962 이 부분에 대해서 눈을 끄시게 되면 이 부분들이 사라져서 536 00:35:23.962 --> 00:35:27.912 더 높은 프레임과 더 적은 드로우 콜 수로 537 00:35:27.912 --> 00:35:29.762 작업을 진행할 수 있습니다 538 00:35:29.762 --> 00:35:35.912 또한 라이팅도 끄고 작업을 진행하실 수도 있죠 Unlit 모드로 539 00:35:38.212 --> 00:35:43.562 그래서 엄청 대규모인 Scene을 활용해서 작업하실 때는 540 00:35:43.562 --> 00:35:46.862 섹션별로 나눠서 레벨을 나누시기도 하고 541 00:35:46.862 --> 00:35:52.662 Lighting, Foliage, Mesh 542 00:35:52.662 --> 00:35:56.262 그런 것들을 나눌 수가 있습니다 543 00:35:58.112 --> 00:36:02.662 이번에는 쉐이더 최적화에 대해서 설명을 드리겠습니다 544 00:36:02.662 --> 00:36:05.862 일단 마스터 머티리얼을 켜보겠습니다 545 00:36:07.062 --> 00:36:10.462 이렇게 복잡한 쉐이더는 GPU 자원을 많이 소모하므로 546 00:36:10.462 --> 00:36:12.262 최적화가 필요합니다 547 00:36:12.262 --> 00:36:15.412 가능한 복잡한 수식을 단순화하거나 548 00:36:15.412 --> 00:36:18.562 불필요한 연산을 제거해 쉐이더를 최적화합니다 549 00:36:18.562 --> 00:36:21.125 아까 말씀드린 뷰 모드에서 550 00:36:22.962 --> 00:36:26.512 여기서 Shader Complexity 뷰 모드를 사용하여 551 00:36:26.512 --> 00:36:31.062 복잡도를 시각화해서 어느 부분이 복잡하고 552 00:36:31.062 --> 00:36:34.212 어느 부분이 정리가 필요한지 찾아내서 553 00:36:34.212 --> 00:36:36.412 머티리얼에 들어오시게 되면 554 00:36:37.312 --> 00:36:40.262 지금은 꽤 많이 정리가 되어 있는 상태입니다 555 00:36:41.612 --> 00:36:47.562 복잡한 거라면 이런 식으로 연결되어 있고 되게 개수가 많아요 556 00:36:47.562 --> 00:36:51.512 이 부분들에 대해서 불필요한 수학 연산이나 557 00:36:51.512 --> 00:36:55.662 복잡한 논리를 최대한 단순화해서 558 00:36:55.662 --> 00:36:58.712 쉐이더를 최적화하는 방법도 있습니다 559 00:37:01.412 --> 00:37:05.362 이번에는 코드 최적화에 대해서 설명드리도록 하겠습니다 560 00:37:05.362 --> 00:37:08.362 이 부분은 집중적으로 다룰 것도 아니고 561 00:37:08.362 --> 00:37:10.762 조금 어려운 부분이기도 하지만 562 00:37:10.762 --> 00:37:15.862 코드 최적화는 CPU 자원 사용을 줄이는 데 매우 중요합니다 563 00:37:15.862 --> 00:37:19.612 블루프린트에서 불필요한 함수 호출을 제거하고 564 00:37:19.612 --> 00:37:21.662 잠시만요 한번 보여드릴게요 565 00:37:23.111 --> 00:37:25.311 예를 들어 블루프린트로 566 00:37:29.511 --> 00:37:32.361 여기서 저희가 필요한 기능을 만들어서 567 00:37:32.361 --> 00:37:36.961 Get All Actors of Class 이렇게 해서 568 00:37:37.811 --> 00:37:42.761 Static Mesh Actor 569 00:37:43.511 --> 00:37:46.561 지금 갖고 있는 Static Mesh를 다 갖고 와서 570 00:37:46.561 --> 00:37:48.811 뒤에 기능들을 추가할 수 있지만 571 00:37:48.811 --> 00:37:53.761 불필요한 함수 호출을 제거하고 572 00:37:53.761 --> 00:37:57.911 비효율적인 루프 구조를 개선하는 것이 좋습니다 573 00:37:57.911 --> 00:38:03.111 루프라고 하면 이런 루프가 있는데 574 00:38:03.111 --> 00:38:06.161 이런 Get All Actors Of Class니까 575 00:38:06.161 --> 00:38:08.361 Static Mesh Actor를 다 가져오게 되면 576 00:38:08.361 --> 00:38:10.211 개수가 되게 많아질 거잖아요 577 00:38:12.061 --> 00:38:17.411 그 배열 속에 있는 Static Mesh들을 다 읽어내는 578 00:38:17.411 --> 00:38:20.761 한 바퀴 돌고 하나 읽고 한 바퀴 돌고 두 번 읽고 579 00:38:20.761 --> 00:38:23.611 그런 식으로 하는 걸 루프라고 하는데 580 00:38:23.611 --> 00:38:27.211 이런 구조를 조금 더 개선하는 것이 좋습니다 581 00:38:27.211 --> 00:38:30.061 특히 블루프린트 스크립트를 사용할 때도 582 00:38:30.061 --> 00:38:34.111 프로파일링을 통해서 병목 구간을 파악해야 합니다 583 00:38:35.411 --> 00:38:39.461 그리고 이벤트 그래프 같은 경우에서도 틱 그래프 584 00:38:39.461 --> 00:38:41.311 이 틱 그래프 같은 경우는 585 00:38:41.311 --> 00:38:45.311 매 프레임마다 계속해서 반응을 하는 건데 586 00:38:47.561 --> 00:38:50.711 불필요한 틱 이벤트 사용을 최대한 피하고 587 00:38:50.711 --> 00:38:55.211 필요한 경우에만 활성화해서 사용해 주시면 될 것 같습니다 588 00:38:57.511 --> 00:39:01.411 이제 프로젝트 세팅에 대해서 설명을 드리겠습니다 589 00:39:01.411 --> 00:39:06.561 일단 세팅에서 프로젝트 세팅을 눌러서 들어오시면 됩니다 590 00:39:07.561 --> 00:39:10.261 일단 프로젝트 세팅에서 저희가 설정할 거는 591 00:39:10.261 --> 00:39:15.211 Frame Rate를 고정적으로 사용하기 위해서 할 건데 592 00:39:15.211 --> 00:39:16.611 그걸 왜 사용하느냐 593 00:39:16.611 --> 00:39:19.961 프로젝트 또는 ICVFX에서 사용될 594 00:39:19.961 --> 00:39:22.911 고정된 프레임 속도를 설정하는 건데 595 00:39:22.911 --> 00:39:25.711 Frame Rate를 사용하는 것이 좋습니다 596 00:39:25.711 --> 00:39:28.111 여기서 일단 Frame Rate 597 00:39:28.961 --> 00:39:32.761 여기서 애니메이션은 어떻게 들어올지랑 598 00:39:32.761 --> 00:39:36.111 그리고 타임 코드 이런 것들을 설정해서 599 00:39:36.111 --> 00:39:38.711 외부에서 쓰고 있는 타임 코드랑 600 00:39:38.711 --> 00:39:40.861 맞춰서 사용하시면 될 것 같습니다 601 00:39:41.711 --> 00:39:45.011 두 번째로는 Motion Blur Unable입니다 602 00:39:45.011 --> 00:39:49.061 ICVFX 환경에서는 실제 카메라와 가상 배경이 603 00:39:49.061 --> 00:39:51.511 완벽하게 동기화가 되어야 합니다 604 00:39:51.511 --> 00:39:55.261 Motion Blur가 활성화되면 카메라의 빠른 움직임이 605 00:39:55.261 --> 00:39:57.811 가상 배경에 적용되는 블러와 606 00:39:57.811 --> 00:40:00.461 실제 카메라와 일치하지 않기 때문에 607 00:40:00.461 --> 00:40:03.361 시각적으로도 어색해 보일 수 있습니다 608 00:40:03.361 --> 00:40:05.411 이런 불일치를 줄이기 위해서는 609 00:40:05.411 --> 00:40:09.361 Motion Blur를 프로젝트 세팅에서 비활성화하게 되면 610 00:40:09.361 --> 00:40:11.660 가상 배경과 실제 촬영 장면이 611 00:40:11.660 --> 00:40:14.810 보다 자연스럽고 일관된 방식으로 표현됩니다 612 00:40:14.810 --> 00:40:21.310 해제하는 방법은 Motion Blur를 검색해서 613 00:40:21.310 --> 00:40:26.210 체크 버튼을 해제해 주시면 될 것 같습니다 614 00:40:26.210 --> 00:40:31.560 그다음은 Auto Exposure Unable입니다 615 00:40:33.110 --> 00:40:35.460 Auto Exposure는 자동 노출인데 616 00:40:35.460 --> 00:40:37.660 ICVFX 작업에서는 자동 노출을 617 00:40:37.660 --> 00:40:40.810 비활성화하는 것이 정말 중요합니다 618 00:40:40.810 --> 00:40:42.910 자동 노출이 활성화되면 619 00:40:42.910 --> 00:40:45.860 LED 벽에 표시된 가상 배경의 밝기가 620 00:40:45.860 --> 00:40:49.110 카메라 움직임에 따라 변화하기 때문입니다 621 00:40:49.110 --> 00:40:52.360 이는 실제 조명과 가상 배경의 밝기가 서로 달라져 622 00:40:52.360 --> 00:40:56.660 촬영 장면의 시각적 일관성을 방해하기 때문에 623 00:40:56.660 --> 00:40:59.610 자동 노출을 비활성화하는 것이 좋습니다 624 00:40:59.610 --> 00:41:02.310 체크를 해제해주시면 됩니다 625 00:41:02.960 --> 00:41:06.360 그다음으로는 Auto Save입니다 626 00:41:06.360 --> 00:41:08.960 Auto Save는 프로젝트 세팅이 아니라 627 00:41:09.410 --> 00:41:17.860 Edit 누르시면 Editor Preferences 이 부분에서 Auto Save 628 00:41:17.860 --> 00:41:20.060 이 부분을 왜 해제하느냐 629 00:41:21.060 --> 00:41:25.760 ICVFX 작업은 여러 시스템과 실시간 연동이 필요합니다 630 00:41:25.760 --> 00:41:30.210 카메라 데이터가 넘어오기도 하고 조명 데이터 631 00:41:30.210 --> 00:41:32.810 네트워크적으로 들어오는 것이 많습니다 632 00:41:32.810 --> 00:41:36.760 그래서 실시간으로 연동이 필요하기 때문에 633 00:41:36.760 --> 00:41:38.610 안정성이 매우 중요합니다 634 00:41:38.610 --> 00:41:42.810 그리고 촬영 중간에 자동 저장 기능이 활성화되면 635 00:41:42.810 --> 00:41:46.210 멀티 유저와의 연결이나 라이브 링크 등 636 00:41:46.210 --> 00:41:49.110 실시간 데이터 연결이 끊길 수 있습니다 637 00:41:49.110 --> 00:41:52.710 이러한 불안정성은 촬영 흐름에 방해가 되거나 638 00:41:52.710 --> 00:41:55.560 실시간 작업에서 오류를 유발할 수 있습니다 639 00:41:55.560 --> 00:41:58.260 따라서 Auto Save 기능은 비활성화하여 640 00:41:58.260 --> 00:42:00.660 작업의 안정성을 유지하는 것이 좋습니다 641 00:42:00.660 --> 00:42:04.560 저희가 작업할 때는 Auto Save를 꼭 끄고 642 00:42:04.560 --> 00:42:07.610 ICVFX 촬영을 진행하고 있습니다 643 00:42:10.360 --> 00:42:14.360 ICVFX에서 주의해야 하는 언리얼 엔진 세팅 644 00:42:15.460 --> 00:42:20.060 ICVFX를 하면서 하면 안 되는 행동들이 있습니다 645 00:42:20.760 --> 00:42:25.460 실시간으로 촬영 중일 때는 프로젝트 세팅이나 디스플레이 등 646 00:42:25.460 --> 00:42:29.460 중요한 설정들을 변경하지 않도록 주의를 해야 합니다 647 00:42:29.460 --> 00:42:34.510 이는 LED벽에 표시되는 가상 배경의 품질에 영향을 미치거나 648 00:42:34.510 --> 00:42:38.260 프레임 드롭 및 시스템 불안정성을 초래할 수 있습니다 649 00:42:38.260 --> 00:42:41.760 그렇기 때문에 그런 중요한 프로젝트 설정들은 650 00:42:41.760 --> 00:42:44.010 변경하지 않는 것이 좋습니다 651 00:42:44.010 --> 00:42:47.760 그다음은 정확한 카메라 설정의 유지 652 00:42:47.760 --> 00:42:50.410 언리얼상의 가상의 카메라와 653 00:42:50.410 --> 00:42:54.260 현실의 실제 카메라의 FOV Field of View 654 00:42:54.260 --> 00:42:59.860 카메라 렌즈 세팅, 필름백, 포커스 세팅 등이 있겠는데요 655 00:43:00.609 --> 00:43:02.759 이 부분들이 일치하지 않으면 656 00:43:02.759 --> 00:43:06.809 가상 배경이 왜곡돼서 보이게 될 수도 있습니다 657 00:43:06.809 --> 00:43:10.859 카메라 움직임과 가상 배경의 자연스러운 일치를 위해 658 00:43:10.859 --> 00:43:15.409 촬영 전에 두 카메라의 설정들을 확인해야 합니다 659 00:43:16.059 --> 00:43:20.359 마지막 주의사항으로는 멀티유저 세션에서의 주의사항인데 660 00:43:20.359 --> 00:43:23.059 여기에 멀티유저 브라우저라고 있습니다 661 00:43:23.059 --> 00:43:28.609 ICVFX를 활용하게 되면 언리얼을 틀고 있는 메인 컴퓨터 662 00:43:28.609 --> 00:43:33.259 그리고 이 화면을 띄우게 될 LED 컴퓨터가 663 00:43:33.259 --> 00:43:35.209 멀티유저에 한 번에 들어와서 664 00:43:36.859 --> 00:43:40.059 카메라를 움직이거나 오브젝트를 움직여도 665 00:43:40.059 --> 00:43:43.109 LED 월에도 한 번에 반영될 수 있게 666 00:43:43.109 --> 00:43:45.359 멀티유저로 들어오게 되는데 667 00:43:45.359 --> 00:43:48.259 멀티유저 세션에서는 한 사용자가 668 00:43:48.259 --> 00:43:52.809 실시간으로 작업 내용을 업데이트하거나 변경할 때 669 00:43:52.809 --> 00:43:56.009 연결된 다른 사용자들이 일시적으로 세션에서 튕기거나 670 00:43:56.009 --> 00:43:58.109 연결이 끊길 수가 있습니다 671 00:43:58.109 --> 00:44:02.309 특히 데이터 양이 많거나 큰 변경이 이루어질 경우 672 00:44:02.309 --> 00:44:05.109 네트워크 지연이나 버퍼링 문제로 673 00:44:05.109 --> 00:44:08.009 튕김 현상이 발생할 가능성이 크기 때문에 674 00:44:08.009 --> 00:44:11.009 이런 조그만 것들은 움직이셔도 되지만 675 00:44:11.009 --> 00:44:15.459 너무 크거나 엄청난 것을 변경해야 된다 676 00:44:15.459 --> 00:44:18.559 그런 경우에는 지양하는 것이 좋습니다 677 00:44:19.559 --> 00:44:23.559 ICVFX의 Web Control 기능 678 00:44:24.409 --> 00:44:27.209 이제 최적화 방식도 알아보고 679 00:44:27.209 --> 00:44:30.559 ICVFX를 하면서 하면 안 되는 680 00:44:30.559 --> 00:44:33.359 그런 방법들에 대해서도 설명을 드렸는데 681 00:44:33.359 --> 00:44:38.209 막간의 팁으로 웹 컨트롤에 대해서 설명을 드리도록 하겠습니다 682 00:44:38.209 --> 00:44:40.909 웹 컨트롤을 사용하는 이유에서는 683 00:44:40.909 --> 00:44:44.209 언리얼 엔진에서 사용자가 프로젝트의 다양한 요소를 684 00:44:44.209 --> 00:44:48.509 원격으로 제어하고 실시간으로도 확인할 수 있도록 도와줍니다 685 00:44:48.509 --> 00:44:52.959 특히 ICVFX In-Camera Visual Effects를 구현하기 위해서 686 00:44:52.959 --> 00:44:54.859 매우 중요한 도구입니다 687 00:44:54.859 --> 00:44:57.059 ICVFX 환경에서 실시간으로 688 00:44:57.059 --> 00:44:59.959 라이팅, 카메라 설정 등을 조정하고 689 00:44:59.959 --> 00:45:01.959 시퀀스를 관리하기도 하며 690 00:45:01.959 --> 00:45:04.609 가상의 프로덕션의 다양한 요소들을 691 00:45:04.609 --> 00:45:07.859 원격으로 효율적으로 관리할 수 있습니다 692 00:45:07.859 --> 00:45:11.559 이를 통해서 실시간으로 원하는 장면을 테스트하거나 693 00:45:11.559 --> 00:45:15.359 라이브 환경에서 즉각적인 피드백을 반영할 수 있습니다 694 00:45:15.359 --> 00:45:22.109 설정하는 방식은 플러그인에서 웹을 먼저 검색해 주시면 695 00:45:22.109 --> 00:45:27.209 Remote Control Web Interface와 Remote Control API 696 00:45:27.209 --> 00:45:31.809 이 두 개를 활성화해 주신 다음에 재시작해 주시면 됩니다 697 00:45:32.759 --> 00:45:37.809 그리고 컨트롤을 껐다 켜시면 아웃풋로그에 보시면 698 00:45:39.109 --> 00:45:48.959 서치 로그에 Remote Control Web Interface 699 00:45:53.108 --> 00:45:56.508 이게 뜨게 되시면 이제 활성화가 된 겁니다 700 00:45:58.558 --> 00:46:02.008 그리고 또 세팅해 줘야 될 게 프로젝트 설정에서 701 00:46:08.158 --> 00:46:14.258 Remote Control 검색하게 되시면 이렇게 있을 텐데 702 00:46:14.258 --> 00:46:17.608 Remote Control Web Interface가 사용하는 703 00:46:17.608 --> 00:46:20.258 포트 번호로 변경을 할 수가 있습니다 704 00:46:20.658 --> 00:46:24.108 이 기능을 통해서 네트워크 충돌을 방지하거나 705 00:46:24.108 --> 00:46:27.758 특정 네트워크 환경에 맞게 설정을 조절할 수가 있습니다 706 00:46:29.158 --> 00:46:31.658 지금은 변경하지 않을게요 707 00:46:31.658 --> 00:46:34.758 그리고 이제 콘텐츠에서 저희가 708 00:46:34.758 --> 00:46:37.458 Remote Control Preset을 만들어야 되는데 709 00:46:37.458 --> 00:46:39.008 일단 오른쪽 클릭해서 710 00:46:39.008 --> 00:46:41.858 아래에 보시면 Remote Control이 있습니다 711 00:46:41.858 --> 00:46:44.808 여기서 Remote Control Preset을 누르시게 되면 712 00:46:44.808 --> 00:46:46.908 이름은 가만히 놔두고 713 00:46:48.108 --> 00:46:51.558 프리셋이 만들어지게 되는데 일단 저장을 눌러주겠습니다 714 00:46:52.858 --> 00:46:57.858 그리고 이제 인터넷을 통해서 저희가 컨트롤하게 될 텐데요 715 00:46:57.858 --> 00:47:01.258 여기서 일단 지금 저희는 로컬로 하기 때문에 716 00:47:01.258 --> 00:47:03.458 바로 진행하도록 하겠습니다 717 00:47:04.658 --> 00:47:10.058 로컬 아이디는 127.0.0.1 그리고 30000 718 00:47:10.058 --> 00:47:14.858 아까 저희가 적은 포트 번호를 입력하시면 이렇게 뜨게 됩니다 719 00:47:16.608 --> 00:47:20.458 여기서 컨트롤과 이 버튼을 누르면 디자인 버튼이 있는데 720 00:47:20.458 --> 00:47:24.208 모드를 전환해서 사용자가 원하는 방식으로 721 00:47:24.208 --> 00:47:27.058 프로젝트를 실시간으로 제어할 수 있습니다 722 00:47:27.408 --> 00:47:29.858 일단 변수를 저희가 달아야 되는데 723 00:47:31.658 --> 00:47:35.108 일단 여기서 설정하기 위해서는 저는 724 00:47:38.408 --> 00:47:44.858 라이트로 하겠습니다 Directional Light의 컬러 725 00:47:44.858 --> 00:47:48.458 컬러를 조절할 수 있는 그런 기능을 넣겠습니다 726 00:47:52.558 --> 00:47:55.808 프리셋을 여시게 되면 이런 아이콘들이 뜨게 됩니다 727 00:47:55.808 --> 00:48:00.058 이런 아이콘들을 웹 컨트롤에 집어넣겠다는 표시고요 728 00:48:00.058 --> 00:48:03.458 이 버튼을 누르시게 되면 여기에 들어갈 거고 729 00:48:03.458 --> 00:48:07.208 여기 아이디에 컬러 적어주시고 나서 730 00:48:08.608 --> 00:48:10.358 다시 웹으로 들어오시게 되면 731 00:48:10.358 --> 00:48:12.308 라이트 컬러가 생기게 됩니다 732 00:48:14.008 --> 00:48:20.758 여기서 이제 디자인에서 컬러 픽하고 733 00:48:20.758 --> 00:48:26.358 Build Your Own UI 이걸 선택하신 다음에 끌어오시면 734 00:48:26.358 --> 00:48:29.757 이런 식으로 UI가 들어오게 된 걸 확인할 수 있습니다 735 00:48:29.757 --> 00:48:33.557 그래서 이걸 사용하는 걸 확인하고 싶으시면 736 00:48:36.707 --> 00:48:38.207 창을 좀 줄일게요 737 00:48:40.407 --> 00:48:46.307 여기서 이제 컬러를 바꾸시게 되면 738 00:48:46.307 --> 00:48:49.407 실시간으로 여기가 변하는 걸 볼 수 있습니다 739 00:48:52.307 --> 00:48:56.507 실시간으로 컬러가 바뀌어서 들어가는 걸 볼 수가 있어요 740 00:48:58.307 --> 00:49:04.257 이런 식으로 원하시는 파라미터 값들을 넣고 조절해서 741 00:49:04.257 --> 00:49:10.057 변화하는 걸 보실 수도 있고 사용할 수가 있습니다 742 00:49:10.707 --> 00:49:13.207 지금까지 ICVFX를 위한 743 00:49:13.207 --> 00:49:16.807 언리얼 엔진 환경 세팅하는 방법에 대해서 알아봤습니다 744 00:49:17.857 --> 00:49:19.557 앞서 설명드린 것처럼 745 00:49:19.557 --> 00:49:22.607 실무를 하다 보면 프로그램이 무거워지며 746 00:49:22.607 --> 00:49:27.357 그만큼 작업에 물리적인 시간이 더 소요될 수 밖에 없습니다 747 00:49:27.957 --> 00:49:32.207 그래서 항상 최적화를 염두에 두면서 환경 세팅을 해두면 748 00:49:32.207 --> 00:49:36.607 그만큼 작업 시간을 줄일 수 있다는 점 기억하시길 바라면서 749 00:49:37.057 --> 00:49:41.607 그럼 이번 시간에 학습한 내용을 정리하면서 마무리하겠습니다 750 00:49:41.607 --> 00:49:43.007 감사합니다 751 00:49:43.357 --> 00:49:44.057 ICVFX를 위한 언리얼 엔진 환경 최적화 752 00:49:44.057 --> 00:49:44.757 Stat Unit 요소 Frame: 게임의 한 프레임 생성에 소요된 총 시간 753 00:49:44.757 --> 00:49:45.457 Game: 게임 스레드에서 사용된 시간 값 Draw: 렌더링 스레드에서 사용된 시간 값 754 00:49:45.457 --> 00:49:46.207 RHIT: 렌더링 하드웨어 인터페이스 스레드에서 소요된 시간 755 00:49:46.207 --> 00:49:46.907 GPU: 실시간 신(Scene) 렌더링에서 사용된 GPU에서 소요된 시간 756 00:49:46.907 --> 00:49:47.607 DynRes(동적 해상도): 게임에서 실시간으로 해상도를 자동 조정하여 성능 최적화 757 00:49:47.607 --> 00:49:48.357 Draws: 드로우 콜의 수 Primes: 현재 오브젝트상 삼각형의 개수 758 00:49:48.357 --> 00:49:49.207 Stat 명령어 Stat FPS: 현재 프레임 속도(FPS) 표시 759 00:49:49.207 --> 00:49:50.007 Stat UnitGraph: Stat Unit의 각 항목 값을 그래프로 시각화 760 00:49:50.007 --> 00:49:50.857 Stat GAME: 게임 스레드에서 각종 작업에 소요되는 시간 내역 표시 761 00:49:50.857 --> 00:49:51.707 Stat Slow: 성능 저하가 발생하는 작업 확인 762 00:49:51.707 --> 00:49:52.507 Stat SceneRendering: 신 렌더링에 대한 자세한 정보 제공 763 00:49:52.507 --> 00:49:53.307 Stat None: 현재까지 활성화된 모든 Stat 명령어 출력 종료 764 00:49:53.307 --> 00:49:54.007 최적화 뷰 모드 Light Complexity: 신의 라이트 복잡도 시각화 765 00:49:54.007 --> 00:49:54.707 Lightmap Density: 라이트맵에 사용되는 밀도 시각화 766 00:49:54.707 --> 00:49:55.407 Stationary Light Overlap : 스테이셔너리 라이트가 겹치는 구간 시각화 767 00:49:55.407 --> 00:49:56.157 Shader Complexity : GPU가 계산하는 쉐이더의 복잡도를 시각화하여 768 00:49:56.157 --> 00:49:56.857 각 픽셀이 수행하는 계산의 복잡도 표시 769 00:49:56.857 --> 00:49:57.557 Shader Complexity & Quads : 쉐이더 복잡도와 쿼드 오버드로우 동시에 시각화 770 00:49:57.557 --> 00:49:58.307 Quad Overdraw: 오버드로우가 발생하는 부분 시각화 771 00:49:58.307 --> 00:49:59.307 다양한 최적화 방법 772 00:49:59.307 --> 00:50:00.307 LOD를 활용한 최적화 나나이트를 활용한 최적화 773 00:50:00.307 --> 00:50:01.307 텍스처 맵을 활용한 폴리곤 최적화 머티리얼 최적화 774 00:50:01.307 --> 00:50:02.307 레벨 스트리밍을 활용한 최적화 쉐이더 최적화 775 00:50:02.307 --> 00:50:03.257 코드 최적화 프로젝트 세팅 776 00:50:03.257 --> 00:50:04.857 ICVFX에서 주의해야 하는 언리얼 엔진 세팅 777 00:50:04.857 --> 00:50:06.557 ICVFX 작업 시 주의사항 실시간 렌더링 중 프로젝트 설정 변경 금지 778 00:50:06.557 --> 00:50:08.207 멀티유저 세션에서는 너무 큰 변경 지양 779 00:50:08.207 --> 00:50:09.457 ICVFX의 Web Control 기능 780 00:50:09.457 --> 00:50:10.707 웹 컨트롤(Web Control) 사용자가 프로젝트 다양한 요소를 원격으로 제어하고 781 00:50:10.707 --> 00:50:11.957 실시간 확인할 수 있도록 하는 도구 782 00:50:11.957 --> 00:50:13.207 원하는 장면을 실시간 테스트하거나 라이브 환경에서 피드백에 즉각 반응할 수 있음