퍼포먼스 및 프로파일링 개요

퍼포먼스 관련 문제를 알아내고 고치는 방법입니다.

Windows
MacOS
Linux

이 안내서에서는 주로 렌더링 관련 내용을 다루게 될텐데, 퍼포먼스가 가장 필요한 부분이기 때문입니다. 오브젝트를 추가하고, 해상도를 늘리고, 라이트를 추가하고, 머티리얼을 향상시키는 것 모두 퍼포먼스에 지대한 영향을 끼칩니다. 다행히도 렌더링에서는, 퍼포먼스 조정이 어렵지 않은 경우가 대부분입니다. 대수의 렌더링 기능은 콘솔 변수로 조정할 수 있습니다.

에디터 출력 로그 또는 게임내 콘솔을 사용해서 할 수 있는 작업은 다음과 같습니다:

  • 콘솔 변수 설정 (cvarname value)

  • 현재 상태 구하기 (cvarname)

  • 변수 도움말 구하기 cvarname ?.

필요한 경우, ConsoleVariables.ini 에 cvarname=value 와 같은 문법으로 설정을 넣을 수 있습니다. 올바른 콘솔 변수를 찾는 방법은, DumpConsoleVars 또는 자동 완성 시스템을 사용하면 됩니다. 대부분의 렌더링 변수는 r. 로 시작합니다.

일반 팁

이상적으로는, 가급적 원하는 타깃에 가깝게 프로파일을 해야 할 것입니다. 예를 들어, 타깃 하드웨어에서 라이트맵 빌드를 포함한 독립형 게임 형태로 게임을 테스트하는 것이 좋은 프로파일링의 예일 것입니다.

좋은 프로파일링을 위해서는, 결과에 노이즈가 낄 수 있는 것들을 고립시킨 재현가능 사례를 구성하는 것이 최선입니다. 에디터를 띄우는 노이즈가 비록 조금이기는 하지만 (콘텐츠 브라우저 를 열면 렌더링 비용이 추가되므로) 게임에서 바로 프로파일링 하는 것이 낫습니다. 어떤 경우에는, 심지어 코드를 변경하는 것이 나을 수도 있습니다 (예: 난수 발생기 비활성화). Pause 명령 또는 Slomo 0.001 도 안정성 향상에 매우 유용할 수 있습니다.

몇 번 측정해 보면서 프로파일링 정확도를 알아봅니다. stat unitstat fps 같은 통계 명령으로 시작 수치를 구할 수 있습니다. 정확한 프로파일링을 위해서는 밀리초 (ms) 단위가 적당하며, 초당 프레임(fps)은 적당하지 않습니다. 수치간의 변환은 쉽게 가능하나, fps 로 측정했을 때의 상대적 향상은 의미가 적습니다. 특정 개별 기능에 대해 이야기할 때는, 프레임을 측정하지 않으므로 밀리초에 대해 이야기합니다.

30 fps (~33.3ms) 또는 60 fps (~16.6ms) 에 제한이 걸린 경우, 아마도 VSync 가 켜진 상태일 것입니다. 보다 정확한 타이밍 정보를 위해서는, 끄고 프로파일링하는 것이 좋습니다.

매우 간단한 씬이라고 해서 프레임 속도가 매우 높게 나오지는 않습니다. 여러가지 복잡한 씬을 위한 디자인 상의 선택으로 인해 (예: 디퍼드 렌더링) 기본 비용이 높을 수밖에 없습니다. 프레임 속도 제한에 벌릴 수도 있습니다. 필요한 경우 그 제한 조정이 (t.MaxFPS, r.VSync 등으로) 가능합니다.

무엇에 묶여있는지 알아내기

최신 하드웨어에는 병렬 실행되는 장치가 많이 있습니다 (예로 GPU: 메모리, 트라이앵글/버텍스/픽셀 처리 등, CPU: 다중 CPU, 메모리 등). 종종 그러한 장치가 서로의 작업이 끝나기를 대기할 수가 있습니다. 그래서 먼저 무엇에 묶여있는지 알아야 합니다. 그 부분을 최적화시켜 주는 것이 퍼포먼스가 향상될 확률이 높습니다. 잘못된 부분에 대한 최적화는 시간 낭비일 뿐만 아니라, 새로운 버그가 생길 수도 있고, 심지어 다른 경우 퍼포먼스가 하락될 수도 있습니다. 특정 부분을 향상시킨 이후에는 다시 프로파일링을 하는 것이 좋은데, 전에는 숨겨져 있던 퍼포먼스 병목 현상이 새로 생길 수도 있기 때문입니다.

먼저 프레임 속도의 제한 원인이 CPU 비용인지 GPU 비용인지 검사해야 합니다. 언제나처럼 (해상도 변경 등) 작업 부하를 조정하고 효과가 있는지 보면 됩니다. 여기서는 stat unit 기능의 엔진 빌드를 보는 편이 낫습니다.

stat_unit.png

콘솔: stat unit

실제 프레임 시간이 제약받는 것은 셋 중 하나입니다: Game (CPU 게임 스레드), Draw (CPU 렌더 스레드), GPU (GPU). 여기서는 GPU 가 (셋 중 가장 크니) 제한 요소임을 알 수 있습니다. Frame 시간을 줄이기 위해서는, 여기서 GPU 작업 부하를 최적화시켜야 합니다.

Show 플래그

엔진 Show (표시) 플래그는 여러가지 렌더링 기능 토글에 사용됩니다. 에디터에 모든 표시 플래그가 편리한 2D UI 형태로 나열되어 있습니다. 메뉴를 닫을 필요 없이 다수의 체크박스를 클릭하여 토글시킬 수 있습니다.

게임 내에서는 show 명령을 사용하면 됩니다. show 로 모든 표시 플래그 목록과 그 상태를 알 수 있습니다. show 표시 플래그 이름 명령으로 기능을 토글시킵니다. 참고로 이 기능은 게임 뷰포트 안에서만 작동하므로, 에디터 뷰포트에서는 에디터 UI 를 사용해야 합니다. 콘솔 변수를 사용하여 (예: showflag.Bloom) 게임 내 또는 에디터 내에서 표시 플래그 값을 덮어쓸 수 있으나, 그렇게 하면 UI 도 비활성화됩니다.

일부 기능은 더이상 아무 것도 렌더링하지 않아도 여전히 퍼포먼스 비용이 발생합니다. 예를 들어 show particles 는 파티클을 숨기지만 나중의 재활성화 지원을 위해서는 시뮬레이션 시간이 계속 필요합니다. 콘솔 변수 fx.freezeparticlesimulation 로 그 업데이트 부분도 비활성화시킬 수 있습니다 (에디터 UI 도 존재합니다). 또 하나: show tessellation 은 트라이앵글 증폭을 비활성화시키나, 테셀레이션 셰이더는 그대로 사용합니다.

프로파일링 시작에 좋은 지점은 하이 레벨 기능으로, 이를테면 show StaticMeshes 또는 show tessellation 입니다.

모든 표시 플래그는 콘솔 변수로도 노출되어 있는데, 예로 콘솔 show Bloom, showflag.Bloom 0 또는 환경설정 파일에서 showflag.Bloom = 0 입니다. 콘솔 변수는 입력양이 더 많지만 에디터 UI 표시 플래그보다 우선하며, 다른 콘솔 변수처럼 환경설정 파일에 넣을 수도 있습니다.

프로파일링에 가장 유용한 것들을 뽑아보면 다음과 같습니다:

표시 플래그

설명

ScreenSpaceReflections

스크린 스페이스 리플렉션 - 스크린 스페이스 리플렉션 토글로, 퍼포먼스 비용이 많이 들 수 있으며, 특정 러프니스 까지의 픽셀에만 영향을 끼칩니다 (r.SSR.MaxRoughness 또는 포스트 프로세스 세팅으로 조정합니다).

AmbientOcclusion

앰비언트 오클루전 - 스크린 스페이스 앰비언트 오클루전입니다 (어떤 씬은 이득이 매우 작을 수 있는데, 스태틱 오브젝트는 라이트매스에 앰비언트 오클루전을 굽기 때문입니다).

AntiAliasing

안티에일리어싱 - TemporalAA 와 FXAA 토글입니다. FXAA 는 더 빠르지만 퀄리티는 낮습니다.

Bloom

블룸 - 이미지 기반 렌즈 플레어와 블룸 기능에 영향을 끼칩니다.

DeferredLighting

디퍼드 라이팅 - 모든 디퍼드 라이팅 패스를 토글시킵니다.

DirectionalLights PointLights SpotLights

디렉셔널 라이트, 포인트 라이트, 스포트 라이트 - 여러 라이트 유형을 토글시킵니다 (각 라이트 유형의 효과와 퍼포먼스 영향을 확인하기에 좋습니다).

DynamicShadows

다이내믹 섀도 - 모든 다이내믹 섀도 토글입니다 (섀도맵 렌더링 및 섀도 필터링/프로젝션).

GlobalIllumination

글로벌 일루미네이션 - 구은 라이팅 - 동적인 간접광 (LPV) 토글입니다.

LightFunctions

라이트 함수 - 라이트 함수 렌더링을 토글시킵니다.

PostProcessing

포스트 프로세싱 - 모든 포스트 프로세싱 패스를 토글시킵니다.

ReflectionEnvironment

리플렉션 인바이런먼트 - 리플렉션 인바이런먼트 패스를 토글시킵니다.

Refraction

리프랙션 - 리프랙션(굴절) 패스를 토글시킵니다.

Rendering

렌더링 - 렌더링 전부 토글시킵니다.

Decals

데칼 - 데칼 렌더링을 토글시킵니다.

Landscape Brushes StaticMeshes SkeletalMeshes Landscape

랜드스케이프 브러시 스태틱메시 스켈레탈메시 랜드스케이프 - 지오메트리 렌더링을 토글시킵니다.

Translucency

반투명 - 반투명 렌더링을 토글시킵니다.

Tessellation

테셀레이션 - 테셀레이션을 토글시킵니다 (트라이앵글 추가 스폰 제외 테셀레이션 셰이더는 계속 실행됩니다).

IndirectLightingCache

간접광 캐시 - 무효화된 라이트맵이 있는 다이내믹 오브젝트 또는 스태틱 오브젝트의 Indirect Lighting Cache (간접광 캐시) 사용을 토글시킵니다.

Bounds

바운드 - 에디터에서 선택된 오브젝트의 바운딩 볼륨을 표시합니다.

Visualize SSR

SSR 시각화 - 스크린 스페이스 리플렉션에 영향받은 모든 픽셀을 밝은 주황색(느림)으로 렌더링합니다, 아래 참고.

SSR.png

콘솔: r.SSR.MaxRoughness 0.9 = 최고 퀄리티 (왼쪽), r.SSR.MaxRoughness 0.1 = 빠름 (오른쪽)

unlit (상단), show VisualizeSSR (하단)

뷰 모드

뷰 모드는 단순히 표시 플래그의 조합입니다. 에디터 UI 는 표시 플래그와 별도이며 ViewMode 콘솔 명령을 사용하여 전환이 가능합니다. 퍼포먼스에 가장 유용한 명령은: Wireframe, LightComplexity, ShaderComplexity, Lit 입니다.

ViewModes.png

여러가지 뷰 모드 (좌우 순서): Lit, LightCompexity (짙을 수록 좋습니다), Wireframe, Shader Complexity (초록이 좋습니다)

다양한 하드웨어 지원 방법

언리얼 엔진의 여러가지 그래픽 기능에는 scalability(엔진 퀄리티) 기능이 내장되어 있습니다. 어플리케이션마다 요구하는 바가 다양하므로 그에 맞는 시스템 커스터마이징을 권합니다.

통합 그래픽 칩은 보통 메모리 서브시스템이 더 느리나 ALU 수와 텍스처 유닛도 적습니다. 폭넓은 범위의 하드웨어에 테스트를 거치거나 실제 퍼포먼스 특성을 파악하는 것이 중요합니다. SynthBenchmark 툴이 테스트할 가치가 있는 하드웨어 그룹 식별에 도움이 될 수 있습니다. 최신 GPU 에는 보통 100 정도 수치가 정상이나, 어떤 부분에 불균형 변화가 보이는 경우, 독특한 특성의 GPU 이므로 특별한 주의가 필요할 수 있습니다.

콘솔에 SynthBenchmark 라 입력하면 툴을 사용할 수 있습니다.

FSynthBenchmark (V0.92):
===============
Main Processor:
        ... 0.025383 s/Run 'RayIntersect'
        ... 0.027685 s/Run 'Fractal'

CompiledTarget_x_Bits: 64
UE_BUILD_SHIPPING: 0
UE_BUILD_TEST: 0
UE_BUILD_DEBUG: 0
TotalPhysicalGBRam: 32
NumberOfCores (physical): 16
NumberOfCores (logical): 32
CPU Perf Index 0: 100.9
CPU Perf Index 1: 103.3

Graphics:
Adapter Name: 'NVIDIA GeForce GTX 670'
(On Optimus the name might be wrong, memory should be ok)
Vendor Id: 0x10de
GPU Memory: 1991/0/2049 MB
      ... 4.450 GigaPix/s, Confidence=100% 'ALUHeavyNoise'
      ... 7.549 GigaPix/s, Confidence=100% 'TexHeavy'
      ... 3.702 GigaPix/s, Confidence=100% 'DepTexHeavy'
      ... 23.595 GigaPix/s, Confidence=89% 'FillOnly'
      ... 1.070 GigaPix/s, Confidence=100% 'Bandwidth'

GPU Perf Index 0: 96.7
GPU Perf Index 1: 101.4
GPU Perf Index 2: 96.2
GPU Perf Index 3: 92.7
GPU Perf Index 4: 99.8
CPUIndex: 100.9
GPUIndex: 96.7

일정 기간에 걸친 차트 생성

일정 기간에 걸친 단위별 통계를 구할 수 있으면 매우 유용하게 쓰일 수 있습니다 (예를 들어 게임 컷씬 또는 다양한 테스트를 위한 카메라 경로 구성 등입니다).

다음 차트는 Android 디바이스(스트리밍)에서 컷씬을 돌려 생성한 것입니다. 컷씬 전후 콘솔 명령 StartFPSChart 와 StopFPSChart 를 입력했습니다. 결과 .csv 파일은 ([ProjectFolder]\Saved\Cooked\Android_ES31\SubwayPatrol\Saved\Profiling\FPSChartStats 폴더에 있으며) Microsoft Excel 로 열었습니다. 이 예제에서는 처음 제목 4 줄을 제거, 전부 선택, Scatter With Straight Lines 플롯을 삽입했습니다.

fpschart.png

콘솔: StartFPSChart, StopFPSChart

퍼포먼스와 프로파일링 관련 세부사항

Select Skin
Light
Dark

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼