PART 5 - 강의 3/5
캐싱 전략
Static/Dynamic 분리와 Shadow Cache Invalidation
01
캐시 무효화 원인
캐시 무효화 원인
- 오브젝트 이동
- 라이트 이동
- World Position Offset (WPO)
- Pixel Depth Offset (PDO)
- 머티리얼 변형
02
Shadow Cache Invalidation Behavior
프리미티브별 오버라이드
enum class EShadowCacheInvalidationBehavior {
Auto, // 기본: WPO/변환 변경 시 무효화
Always, // 항상 무효화
Rigid, // WPO 무효화 억제 (정적 WPO용)
Static // Rigid + 변환 변경도 억제
};
권장 설정
정적 WPO(예: 정적 변형)에는 Rigid를 사용하여 불필요한 캐시 무효화를 방지하세요.
03
Static/Dynamic 캐시 분리
정적/동적 오브젝트의 별도 캐시 관리
캐시 분리 설정
// Static/Dynamic 캐시 분리 활성화
r.Shadow.Virtual.Cache.StaticSeparate = 1
// 정적 오브젝트: 별도 캐시 페이지에 렌더링
// -> 동적 오브젝트가 움직여도 정적 캐시 유지
// 캐시 상태 시각화
r.Shadow.Virtual.Cache.DrawInvalidatingBounds = 1
// 빨간색 바운드 = 캐시 무효화 유발 오브젝트
Static/Dynamic 분리 이점
정적/동적 캐시를 분리하면, 동적 오브젝트(캐릭터, 차량 등)가 움직여도 정적 그림자는 재렌더링하지 않습니다. 동적 오브젝트가 영향을 주는 페이지만 업데이트됩니다.
04
캐시 효율 모니터링
프로파일링으로 캐시 히트율 확인
캐시 프로파일링
// 섀도우 캐시 통계
stat ShadowRendering
// Cache Hit Rate: 높을수록 좋음 (90%+ 목표)
// Invalidations: 낮을수록 좋음
// 무효화 원인 파악
r.Shadow.Virtual.Cache.DrawInvalidatingBounds = 1
// 전체 캐시 강제 무효화 (테스트용)
r.Shadow.Virtual.Cache.ForceInvalidateDirectional = 1
캐시 히트율 개선 전략
- WPO Disable Distance 설정 - 먼 거리에서 WPO 비활성화
- 정적 WPO에 Rigid 사용 - 불필요한 무효화 방지
- Static/Dynamic 분리 - 정적 캐시 보존
- 불필요한 동적 그림자 비활성화
SUMMARY
핵심 요약
- WPO, 이동 등이 캐시 무효화 유발
- Shadow Cache Invalidation Behavior로 세밀한 제어
- Static/Dynamic 캐시 분리로 정적 그림자 보존
- 캐시 히트율 90%+를 목표로 최적화
PRACTICE
도전 과제
배운 내용을 직접 실습해보세요
실습 1: 캐시 무효화 시각화
r.Shadow.Virtual.Cache.DrawInvalidatingBounds = 1로 캐시 무효화를 유발하는 오브젝트를 시각화하세요. 움직이는 오브젝트와 WPO 메시가 빨간색 바운드로 표시되는 것을 확인하세요.
실습 2: Shadow Cache Invalidation Behavior 테스트
WPO가 적용된 메시에서 Invalidation Behavior를 Auto, Rigid, Static으로 각각 설정하고 stat ShadowRendering의 Cache Hit Rate 변화를 비교하세요.
심화 과제
Fortnite 사례처럼 r.Shadow.Virtual.Cache.ForceInvalidateDirectional = 1로 Directional Light 캐싱을 포기하고, 모든 메시를 Nanite화하여 Raw 렌더링 성능만으로 목표 프레임레이트를 달성하는 전략을 테스트하세요.