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 렌더링 성능만으로 목표 프레임레이트를 달성하는 전략을 테스트하세요.