시네마틱 최적화
실시간 컷씬의 성능 프로파일링, LOD 전략, 스트리밍, 메모리 관리 기법을 마스터합니다
성능 프로파일링
시네마틱 병목 찾기
실시간 컷씬은 게임플레이보다 높은 비주얼 품질을 요구하면서도 목표 프레임 레이트를 유지해야 합니다. 체계적인 프로파일링이 필수입니다.
프로파일링 도구
| 도구 | 분석 대상 | 사용법 |
|---|---|---|
| stat unit | 프레임 타임 (Game/Draw/GPU) | 콘솔 명령어 |
| stat gpu | GPU 패스별 비용 | 콘솔 명령어 |
| Unreal Insights | 전체 시스템 프로파일링 | -trace=default,gpu 옵션 |
| GPU Visualizer | GPU 패스 상세 타이밍 | Ctrl+Shift+, (콤마) |
| stat LevelSequence | 시퀀서 평가 비용 | 콘솔 명령어 |
| RenderDoc / NSight | GPU 프레임 캡처 | 외부 도구 연동 |
// 기본 프레임 타임 확인
stat unit
stat fps
// GPU 패스별 비용 (가장 유용)
stat gpu
ProfileGPU // GPU Visualizer 열기
// 시퀀서 평가 비용
stat LevelSequence
// 메모리 사용량
stat Memory
stat Streaming
// 드로우콜 확인
stat SceneRendering
// Unreal Insights 트레이스
// 실행 시 -trace=default,gpu,bookmark 추가
시퀀서를 재생하면서 stat gpu로 각 프레임의 병목을 확인합니다. 특히 카메라가 바뀌는 시점, 많은 액터가 보이는 와이드 샷, 이펙트가 집중되는 구간에서 프레임 드랍이 발생하기 쉽습니다.
LOD와 가시성 관리
카메라 각도에 따른 최적화 전략
컷씬 전용 LOD 전략
컷씬에서는 카메라의 위치와 각도가 사전에 결정되어 있으므로, 카메라에 보이지 않는 오브젝트를 공격적으로 최적화할 수 있습니다.
| 기법 | 설명 | 절감 효과 |
|---|---|---|
| Visibility 트랙 | 샷별로 불필요한 액터 숨김 | 드로우콜 대폭 감소 |
| LOD Bias 오버라이드 | 컷씬 중 근접 캐릭터만 LOD 0 유지 | 폴리곤 수 감소 |
| Nanite LOD | Nanite 메시는 자동 LOD 처리 | 수동 LOD 불필요 |
| Cull Distance Volume | 거리 기반 자동 컬링 | 원거리 오브젝트 제거 |
| HLOD | 원거리 메시 병합 | 드로우콜 + 메모리 절감 |
// 마스터 시퀀스의 각 샷에서:
// Shot_010 (클로즈업 샷 - 캐릭터 얼굴만)
// - 배경 Static Mesh 그룹: Visibility = Hidden
// - 먼 거리 NPC: Visibility = Hidden
// - 캐릭터: LOD 0 강제, 머티리얼 최고 품질
// Shot_020 (와이드 샷 - 전체 환경)
// - 모든 오브젝트: Visibility = Visible
// - 카메라 반대편 오브젝트: Visibility = Hidden
// - 원거리 NPC: LOD 2 이상
// 이벤트 트랙으로 LOD 강제 전환:
// OnShotStart() { Mesh->SetForcedLodModel(0); }
// OnShotEnd() { Mesh->SetForcedLodModel(0); } // 리셋
스트리밍과 메모리
Level Streaming과 텍스처 관리
Level Streaming 연동
긴 컷씬에서 장면이 전환될 때 새로운 레벨을 스트리밍하고 이전 레벨을 언로드하는 것이 메모리 관리의 핵심입니다.
// Event Track에서 Level Streaming 제어
// Shot_010 시작 전 (미리 로드)
// Frame -60: LoadStreamLevel("BattleArena")
// Shot_010 시작
// Frame 0: SetStreamLevelVisible("BattleArena", true)
// Shot_020으로 전환 (장소 변경)
// Frame 200: LoadStreamLevel("Castle")
// Frame 240: SetStreamLevelVisible("Castle", true)
// Frame 240: SetStreamLevelVisible("BattleArena", false)
// Frame 300: UnloadStreamLevel("BattleArena")
텍스처 스트리밍 최적화
| 콘솔 변수 | 설명 | 컷씬 권장값 |
|---|---|---|
| r.Streaming.PoolSize | 텍스처 스트리밍 풀 (MB) | 2048~4096 |
| r.Streaming.FullyLoadUsedTextures | 사용 중인 텍스처 풀 로드 | 1 (컷씬 중) |
| r.Streaming.HLODStrategy | HLOD 스트리밍 전략 | 프로젝트별 설정 |
| r.Streaming.Boost | 스트리밍 속도 부스트 | 2.0 (컷씬 시작 시) |
컷씬 시작 시 텍스처가 저해상도에서 고해상도로 전환되는 "팝핑" 현상을 방지하려면, 컷씬 시작 전에 r.Streaming.FullyLoadUsedTextures=1을 설정하고 충분한 워밍업 프레임을 확보하세요.
렌더링 최적화 기법
GPU 비용 절감과 시각 품질 균형
샷별 렌더링 설정 오버라이드
시퀀서의 Console Variable 트랙을 사용하면 샷별로 렌더링 품질을 다르게 설정할 수 있습니다.
// 클로즈업 샷 (높은 품질)
// r.ScreenPercentage = 100
// r.DepthOfFieldQuality = 4
// r.Shadow.MaxResolution = 4096
// 와이드/액션 샷 (성능 우선)
// r.ScreenPercentage = 85 (TSR 업스케일)
// r.DepthOfFieldQuality = 2
// r.Shadow.MaxResolution = 2048
// 이펙트 집중 샷 (파티클 최적화)
// fx.Niagara.QualityLevel = 3 (최고)
// r.BloomQuality = 5
// r.LightShaftQuality = 1
Lumen 최적화
| 설정 | 성능 영향 | 컷씬 권장 |
|---|---|---|
| r.Lumen.TraceMeshSDFs | 높음 | 1 (디테일 GI 필요 시) |
| r.Lumen.DiffuseIndirect.Allow | 높음 | 1 (항상 활성) |
| r.Lumen.Reflections.Allow | 중간 | 1 (반사 표면 있을 때) |
| r.Lumen.ScreenProbeGather.ScreenSpaceBentNormal | 중간 | 1 (AO 품질 향상) |
UE5의 TSR을 활용하면 r.ScreenPercentage=85로 렌더 해상도를 낮추고 TSR이 업스케일하여 네이티브에 근접한 품질을 유지하면서 GPU 비용을 15~25% 절감할 수 있습니다. 와이드 샷이나 액션 시퀀스에서 특히 효과적입니다.
핵심 요약
stat gpu와 GPU Visualizer로 시네마틱의 GPU 병목을 정확히 파악한다- Visibility 트랙으로 샷별로 카메라에 보이지 않는 오브젝트를 숨겨 드로우콜을 대폭 줄인다
- Level Streaming을 이벤트 트랙으로 제어하여 장면 전환 시 메모리를 효율적으로 관리한다
- 텍스처 팝핑 방지를 위해
r.Streaming.FullyLoadUsedTextures=1과 워밍업 프레임을 확보한다 - Console Variable 트랙으로 클로즈업(고품질)/와이드(성능 우선) 샷별 렌더링 설정을 차별화한다
- TSR을 활용하면 ScreenPercentage 85%에서도 네이티브에 근접한 품질을 유지할 수 있다
도전 과제
배운 내용을 직접 실습해보세요
Unreal Insights를 사용하여 시퀀서 평가 비용을 측정하세요. 트랙 수, 바인딩 수, 서브시퀀스 깊이에 따른 성능 변화를 기록하고 병목 구간을 식별하세요.
시네마틱에서 카메라에 보이지 않는 Actor를 자동으로 숨기는 Visibility 전략을 구현하세요. Camera Frustum 기반으로 불필요한 오브젝트를 비활성화하세요.
대규모 시네마틱(100+ 트랙)의 에디터/런타임 성능을 최적화하세요. Precompiled Evaluation Template, 사용하지 않는 트랙 비활성화, 바인딩 캐싱, Pre-Roll 최소화 전략을 적용하세요.