개요
파티클의 퍼포먼스를 측정하면 최적화할 때 주력해야 할 구체적인 영역을 파악할 수 있습니다. 변경을 수행하기 전에 가정을 검증하는 것이 중요합니다. 그래야 불필요한 부분을 실수로 최적화하지 않을 수 있으며, 변경이 얼마나 영향을 미치는지 확인할 비교 포인트를 확보할 수 있습니다.
이 문서에서는 나이아가라 파티클 시스템의 퍼포먼스 측정용으로 제공되는 몇 가지 언리얼 툴과 그러한 툴에서 나온 데이터를 읽고 데이터를 기반으로 결정하는 방법을 살펴봅니다.
퍼포먼스 측정하기
언리얼 인사이트 - 레벨에서 시스템 측정하기
대표적인 게임플레이 시간대, 이상적으로는 실제 게임 자체를 캡처하면 최적화에 가장 적합한 데이터를 얻을 수 있습니다. 한 프로젝트에 적합한 데이터가 다른 프로젝트에도 항상 적합한 것은 아니며, 심지어 같은 프로젝트 내에서도 레벨마다 다를 수 있습니다. 예를 들어, 제어된 카메라가 있는 컷씬에 일반 게임플레이 중에 실행하기에는 비용이 너무 많이 드는 3D 유체 시뮬레이션을 실행할 예산이 포함되어 있을 수 있습니다.
이는 프로젝트와 상호작용하는 파티클 시스템에 대한 전체적인 관점을 보여주기도 합니다. 그 자체로는 예산 내에 있는 파티클 시스템도 짧은 시간에 수십 개의 인스턴스가 스폰되면 너무 많은 리소스가 소모될 수 있습니다. 스폰이 분산되어 있더라도 화면 밖에 있는 인스턴스를 틱하면 불필요한 리소스가 소모됩니다.
언리얼 인사이트는 프로젝트를 프로파일링하여 프레임 내 엔진 시스템의 타이밍과 단일 프레임의 전체 타이밍을 보여줍니다. 이를 통해 프로젝트의 프레임 시간이 급증하는 스파이크를 찾고 어떤 시스템이 속도 저하에 얼마나 영향을 주는지 파악할 수 있습니다. 적절한 구성을 통해 작동 중인 특정 나이아가라 시스템도 정확하게 찾아낼 수 있습니다.
자세한 나이아가라 캡처를 얻기 위해 인사이트 구성하기
기본적으로 에셋 이름과 일부 함수 호출은 언리얼 인사이트 트레이스에 포함되지 않습니다. 명령줄 실행인자에 StatNamedEvents를 추가하면 인사이트가 이러한 이벤트를 캡처할 수 있습니다. 이러한 이름을 캡처하면 오버헤드가 발생하므로, 병목 지점을 찾는 데만 사용한 후 명명된 이벤트 없이 캡처하여 대표적인 타이밍을 확인하는 것이 가장 좋은 방법입니다.
이 문서에서 예로 든 측정은 봇이 있는 엘리미네이션(Elimination) 게임 모드의 LyraGame 타깃과 개발 환경설정이 포함된 패키지로 만든 라이라(Lyra) 게임에서 측정한 것입니다.
인사이트 캡처를 얻은 다음에는 이러한 나이아가라 타이머를 사용하여 타이밍 뷰의 메인 그래프에서 스파이크를 찾을 수 있습니다. 이와 함께 프레임 뷰를 사용하면 나이아가라 특유의 스파이크가 프레임 시간 스파이크와 어떤 연관이 있는지 파악할 수 있습니다.
나이아가라 타이머 이해하기
나이아가라 프로파일링은 다양한 타이머로 세분화되어 있어 나이아가라가 가장 많은 시간을 소모하는 지점을 정확히 짚어내므로 최적화에 주력할 부분을 쉽게 파악할 수 있습니다.
게임 스레드(Game Thread)
틱(Ticking)
- 나이아가라 매니저 틱 GT - 기본적으로 나이아가라 시스템은 나이아가라 월드 매니저(Niagara World Manager)에 의해 배치 처리로 틱됩니다. 이 타이머를 통해 GT에서 틱하는 데 소요된 시간과 비동기 틱 태스크 완료를 대기하는 데 소요된 시간을 전체적으로 확인할 수 있습니다. 엔진 퀄리티도 여기서 처리됩니다. 시뮬레이션은 틱 그룹별로 배치 처리되므로 서로 다른 틱 그룹에 있는 같은 시스템의 인스턴스는 같은 시스템 시뮬레이션을 공유하지 않습니다. 참고: 솔로 시스템은 개별적으로 틱되며 여기서 배치 처리되지 않습니다.
- 시스템 시뮬레이션 틱 GT - 같은 틱 그룹에 있는 시스템의 모든 인스턴스를 틱하는 데 소요된 게임 스레드 시간으로, 트랜스폼 수집, 파라미터 저장소 처리 같은 비동기 틱에 대한 정보를 준비하는 데 사용됩니다.
- 시스템 인스턴스 틱 GT - 솔로 시스템 인스턴스 틱입니다.
- 시스템 인스턴스 WaitForAsyncTick GT - 게임 스레드에서 인스턴스의 비동기 틱을 기다리는 데 소모된 시간입니다.
- 나이아가라 매니저 업데이트 엔진 퀄리티 매니저 GT - 엔진 퀄리티 업데이트에 소모된 시간입니다.
활성화(Activation)
- 활성화 (GT)(Activate (GT)) - 나이아가라 컴포넌트 활성화에 소모된 시간입니다.
- 시스템 활성화 (GT)(System Activate [GT]) - 시스템 인스턴스 활성화에 소모된 시간입니다.
작업자 스레드(Worker Threads)
- FNiagaraSystemSimulationTickConcurrentTask 및 시스템 시뮬레이션 틱 CNC - 시스템 시뮬레이션 틱을 위해 수행된 동시 작업입니다. 시스템 및 이미터 스크립트는 단일 VM 스크립트로 컴파일됩니다. 이 태스크는 벡터 VM(Vector VM)을 호출하고 해당 스크립트를 실행합니다.
- 이미터 인스턴스에 데이터 전송
- 시스템 인스턴스 태스크 실행
- 시스템 인스턴스 틱 CNC - 이미터 스크립트의 파티클 부분에 대한 틱을 구성하고 실행합니다.
- 이미터 틱 CNC - CPU 시뮬레이션을 위해 이미터의 파티클 스테이지를 틱하는 데 소모된 시간입니다.
- 이미터 시뮬레이션 CNC - 파티클 업데이트(Particle Update)에 해당합니다.
- 이미터 스폰 CNC - 파티클 스폰(Particle Spawn)에 해당합니다.
- 이미터 이벤트 처리 CNC - 파티클 이벤트 핸들러(Particle Event Handlers)에 해당합니다.
렌더 스레드(Render Thread)
- 컴퓨트 디스패치(GPU 이미터 디스패치[RT])(Compute Dispatch (GPU Emitter Dispatch [RT]))
- 파티클 스폰 및 업데이트, 시뮬레이션 스테이지를 포함한 GPU 시뮬레이션 스크립트를 실행합니다.
- 디스패치는 그룹이 오버랩되지 않도록 안전하게 정렬됩니다.
- 렌더링에 사용되는 최종 버퍼를 결정합니다.
- 다음에서 실행될 수 있습니다.
- Pre Init Views
- Post Init Views
- Post Render Opaque
- GPU 시뮬레이션에 사용되는 기능은 뎁스 읽기, 디스턴스 필드 샘플링 등의 실행 시기를 결정합니다.
- 시스템 에디터 표시(System Editor Show) 메뉴에서 'GPU 틱 정보(GPU Tick Information)'를 활성화하면 시뮬레이션에서 활성화된 기능을 확인할 수 있습니다.
- 다이내믹 메시 엘리먼트 가져오기(Get Dynamic Mesh Elements)
- 렌더러의 지오메트리와 관련된 비용으로, 다음에 따라 달라집니다.
- 렌더러 수
- 시스템이 표시되는 뷰의 수
- 렌더러 타입
- 렌더러의 지오메트리와 관련된 비용으로, 다음에 따라 달라집니다.
- CPU 이미터는 GPU에 데이터를 복사해야 합니다.
- 렌더러 비저빌리티(Renderer Visibility) 및 메시 인덱스(Mesh Index)에는 정렬 및 컬링 GPU 태스크가 필요합니다.
- 파티클별 메시 LOD는 더 많은 메시 배치를 빌드해야 합니다.
예시 캡처
아래는 라이라 게임에서 예시로 캡처한 스크린샷으로, 매치 시작 무렵에 프레임 스파이크가 있습니다. 대부분의 프레임 시간은 플레이어 및 AI 컨트롤러 스폰에 소모되지만, 다른 프레임에 비해 나이아가라 시스템에서 스파이크가 있었으며, 여기에는 해당 프레임의 모든 작업자 스레드에 걸쳐 건 패드 시스템이 0.96밀리초까지 소모한 것도 포함됩니다.
전체 프레임 시간은 33.5밀리초로, 이는 대략 30fps에 해당합니다. 나머지 게임에서는 70~80fps로 확인되므로, 이는 상당한 스파이크입니다. 하지만, 나이아가라가 GT에서 틱에 소모한 시간은 0.4밀리초에 불과했기에 건 패드 시스템이 GT 오버헤드에 크게 영향을 주지는 않았습니다.
참고: 이 캡처에 사용된 하드웨어에는 Threadripper CPU가 있으므로 콘솔 하드웨어에 비해 작업자 스레드 퍼포먼스가 현실적이지 않을 수 있으며, 플랫폼에 따라 태스크 스레드에서 대기하는 데 따른 GT 오버헤드가 더 많을 수도 있습니다.
나이아가라 매니저 틱을 더 자세히 살펴보면 이 프레임에서 15개의 건 패드 인스턴스가 틱하는 것을 볼 수 있는데, 이는 모두 한 번에 스폰되기 때문에 예상할 수 있는 일입니다. 또한 렌더링되지 않은 지 겨우 1초 후에 컬링되도록 설정되어 있기 때문에 연관성이 유지되면서 계속 틱하므로, 모든 건 패드를 한 번에 스폰하기 위해 지속적인 오버헤드가 발생합니다. 다른 아이템 픽업도 동일하게 작동합니다.
따라서 현재는 나머지 프레임과 비교해서 오버헤드가 크지 않을 수 있지만, 이는 필요 이상으로 많은 연관 시스템이 있을 때 발생하는 오버헤드를 보여주는 예시입니다. 시스템의 퍼포먼스가 낮거나, 대표적인 타깃 하드웨어가 느리거나, 레벨에 더 많은 시스템이 있다면, 최적화에 큰 도움이 될 수 있으며, 특히 레벨 초기화 시 프레임 리소스가 부족한 경우 더 효과적일 것입니다.
시뮬레이션 최적화를 살펴보기 위해 먼저 타이머(Timers) 탭을 통해 건 패드(Gun Pad) 시스템에 대한 타이밍을 살펴보고, 특히 피호출자(Callees) 탭을 자세히 살펴보겠습니다. 여기에는 선택한 타이머의 자손인 모든 타이머의 기여도가 표시됩니다. 이 경우에는 자손의 타이머를 포함하여 타이머에서 소모된 총시간인 포함 시간(Inclusive Time)을 기준으로 기여도가 정렬되어 있습니다.
참고로 시스템 인스턴스 틱을 실행하는 몇 개의 작업자 스레드에 대한 트랙은 다음과 같습니다. 각 스레드는 순차적으로 4개의 인스턴스 틱을 실행합니다.
다음은 하나의 시스템 인스턴스 틱만을 확대한 것이므로, 다양한 이미터 틱을 볼 수 있습니다. 각 이미터 틱은 0.003~0.008밀리초 정도 기여하고 있습니다.
전체 프레임에서는 PA_Rings가 0.06밀리초 정도, Beam_Base, Beam_Diffuse 및 Beam_Core가 0.056~0.057밀리초 정도 기여하고 있습니다. 단, 이는 하나의 프레임만 살펴본 것이므로, 최적화에 주력할 부분을 판단하려면 보다 대표적인 시간대와 그 평균을 살펴봐야 합니다.
다음은 이미터 틱에 초점을 맞춘 더 광범위한 시간 범위의 타이머 탭입니다. 앞서 본 시간보다 평균이 상당히 낮은데, 이는 엔진 퀄리티가 적용된 후이며 한 프레임에서 실행되는 시스템 인스턴스가 더 적기 때문에 당연한 현상입니다. 이 데이터에서는 Cubes_Trails가 가장 비용을 많이 소모하는 이미터로 보이지만, 각각 0.01밀리초 이하로, 상당히 미미한 수준입니다.
나이아가라 에디터의 퍼포먼스 모드를 사용하여 에셋을 더 자세히 살펴보고 최적화 방안을 찾을 수 있습니다. 인스턴스 수 최적화의 경우, 플레이어 캐릭터로부터 멀리 떨어진 건 패드 이펙트의 스폰을 딜레이하거나 시차를 둘 수도 있고, 아니면 이펙트 타입에 사전 컬링을 적용해 볼 수도 있습니다.
참고: 나이아가라 에디터의 퍼포먼스 모드는 새로운 가상 머신에서는 작동하지 않습니다.
먼저 인사이트 캡처의 풋프린트에 대한 이 목록의 맨 위에 있는 큐브 트레일(Cube Trails) 이미터를 살펴보겠습니다. 위의 캡처에서는 모듈 타이밍에 대한 상댓값과 함께 평균 시간이 표시되어 있습니다. 업데이트 스크립트 타이밍은 약 0.01~0.02밀리초로 인사이트 캡처에서 확인된 타이밍과 거의 일치합니다. 하지만, 모듈 자체는 업데이트 스크립트에서 이 타이밍의 많은 부분을 차지하지 않습니다.
그래도 여기서 몇 가지를 빠르게 최적화할 수 있습니다. 큐브 트레일 이미터는 소스 이미터에서 파티클을 샘플링할 때 속도를 상속받지 않지만, 종속성 시스템은 그 사실을 모르므로 항상 힘과 속도 솔브(Solve Forces and Velocities) 모듈을 추가하라고 권장합니다. 이 모듈을 제거하고 다른 이미터에서 파티클 샘플링(Sample Particles from Other Emitter) 모듈에서 생성된 문제를 해제하면 오버헤드를 줄이면서(나이아가라 에디터에 따르면 최대 5% 감소) 동일한 행동을 구현할 수 있습니다.
컬러 스케일링에 대한 여러 호출이 결합되고 단순화되어 추가로 최적화가 이루어질 수 있습니다.
이미터 업데이트 및 파티클 스폰에서 소스 이미터에서 스폰하고 샘플링하는 것은 다른 모듈에 비해 많은 비용이 소모됩니다. 다른 이미터에서 샘플링할 필요가 완전히 없어지면 이미터 수가 감소하고 퍼포먼스도 향상됩니다. 하지만, 이는 사소한 작업이 아니며, 이미 이미터를 통합하려는 노력의 결과로 현재 구성이 이루어졌을 가능성이 큽니다. 각 트레일에 대해 이미터를 두는 대신, 두 개로 통합하는 것이 적절한 대안입니다.
향후에는 각 트레일에 대해 스테이트리스 이미터로 전환하는 것이 최고의 최적화가 될 것입니다.
이펙트를 리빌드하지 않고는 큐브 트레일 이미터로 할 수 있는 일이 별로 없으므로, 최적화할 다른 영역을 찾아봐야 합니다.
Beam_Base와 Beam_Core를 살펴보면 데이터에 약간의 차이만 있을 뿐 거의 같은 로직을 실행하므로, 단일 이미터로 병합하기에 적합합니다. 게다가 이 둘은 같은 렌더러를 공유할 수 있으므로 두 이미터를 결합할 때 비저빌리티 태그를 사용할 필요가 없어 관련된 오버헤드를 피할 수 있습니다.
전체적으로, 병합할 수 있는 다른 이미터도 있겠지만, 이 두 이미터를 병합하는 것보다는 어려울 것입니다. 향후 경량 이미터로 마이그레이션하는 것이 이 사용 사례에는 가장 적합할 것입니다.
뷰 모드 - 렌더링 복잡도 측정
VFX에는 반투명 스프라이트와 메시가 오버랩되는 경우가 많아 종종 오버드로를 야기할 수 있으므로 나이아가라 시스템의 셰이더 복잡도에 대한 유효성을 확인하는 것도 중요합니다. 셰이더 복잡도 뷰 모드(Shader Complexity View Mode)를 통해 복잡도에 대한 일반적인 개요를 확인할 수 있습니다. 오버드로에 대한 더 자세한 뷰는 쿼드 오버드로 뷰 모드(Quad Overdraw View Mode)를 통해 확인할 수 있습니다.
파티클 수를 줄이고 더 분산함으로써 오버드로를 줄일 수 있습니다. 파티클이 차지하는 스크린 스페이스가 적을수록 이 문제도 덜 발생합니다.
위의 이미지는 익스팬스(Expanse) 레벨의 건 패드 중 하나를 캡처한 것입니다. 이 이펙트에는 오버드로가 상당히 많으며, 레벨 전체에 이런 현상이 일반적입니다. 스프라이트가 덜 오버랩되도록 최적화할 수는 있지만, 그러면 이펙트의 비주얼도 변경됩니다. 스폰 수 스케일링을 사용하면 다양한 엔진 퀄리티 세팅에서 스폰되는 파티클 수를 줄여 서로 다른 플랫폼 간의 균형을 맞출 수 있습니다.
이 파티클 시스템의 오버드로를 더 자세히 살펴보려면, 나이아가라 에디터에서 다양한 뷰 모드를 사용하여 시스템에 적용되는 편집 효과를 실시간으로 확인할 수 있습니다.
이 이미지는 오버드로 뷰와 라이팅포함 뷰를 나란히 비교한 것입니다. 왼쪽은 편집되지 않은 시스템이고, 오른쪽은 NE_RingMeshTimerInternal, Beam_Core 및 Beam_Based 이미터가 비활성화된 시스템입니다. 이렇게 하면 7 이상의 거의 모든 오버드로가 제거됩니다. 이미터를 켜고 끄는 것만으로도 오버드로를 줄이기 위해 어느 부분에 주력해야 할지 잘 알 수 있습니다.
나이아가라는 엔진 퀄리티 세팅에 기반한 스폰 수 스케일링을 기본적으로 지원합니다. 나이아가라 에디터의 엔진 퀄리티(Scalability) 모드에서 다양한 엔진 퀄리티 오버라이드와 세팅을 이용할 수 있습니다. 테스트용으로 위에서 비활성화한 세 개의 이미터에 엔진 퀄리티 오버라이드를 추가하여 중간(Medium) 엔진 퀄리티 이하에서 스폰 수를 절반으로 줄였습니다.
낮음(Low) 및 중간(Medium) 엔진 퀄리티에서 이미터 엔진 퀄리티 오버라이드를 통한 스폰 수 스케일링
엔진 퀄리티 모드에서 다양한 엔진 퀄리티를 빠르게 토글하면서 그 차이를 프리뷰할 수 있습니다. 이 이미지는 중간 및 높음 엔진 퀄리티의 라이팅포함 뷰를 나란히 비교한 것입니다. 밝기 차이가 두드러지지만, 일부 머티리얼을 변경하면 그 차이를 줄일 수 있습니다.
이 이미지는 쿼드 오버드로를 나란히 비교한 것입니다. 빔의 7+ 영역은 거의 완전히 제거되었고, 링에 8+의 커버리지는 여전히 많지만, 10의 커버리지는 대부분 줄어들었습니다.
이를 통해 스폰 수 스케일링이 이 시스템의 오버드로를 줄이는 데 효과적이며, 각 엔진 퀄리티 레벨을 추가 조정하여 각각의 타깃 하드웨어에 대해 충실도와 퍼포먼스 간의 균형을 맞출 수 있음을 알 수 있습니다.
가변 비율 셰이딩을 지원하는 플랫폼의 경우, 시스템에서 사용되는 머티리얼의 셰이딩 레이트를 조정하여 오버드로의 영향을 줄일 수도 있습니다. 이는 머티리얼(Material) > 고급(Advanced) > 셰이딩 레이트(Shading Rate) 아래의 머티리얼 디테일에서 제어합니다. 셰이딩 레이트는 머티리얼이 그려지는 해상도를 효과적으로 줄입니다.
나이아가라 디버거
나이아가라 디버거에도 퍼포먼스 프로파일링 툴이 포함되어 있으며, 이를 PIE와 함께 사용하여 더 빠르게 퍼포먼스를 프로파일링할 수 있습니다. 자세한 내용은 나이아가라 디버거 문서에서 확인할 수 있습니다.