PSO 캐싱 전략
셰이더 컴파일 스터터링을 방지합니다
PSO란?
Pipeline State Object
PSO (Pipeline State Object)는 렌더링 객체에 필요한 셰이더들과 GPU 설정(컬링 모드, 블렌드 모드, 깊이/스텐실 비교 모드 등)을 패키징한 것입니다.
새 PSO를 온디맨드로 생성하면 100ms 이상 걸릴 수 있어 스터터링(끊김)의 주요 원인이 됩니다. 게임 중 갑자기 끊기는 현상의 상당수가 PSO 컴파일 때문입니다.
🎨 새 머티리얼 조합
처음 렌더링되는 머티리얼
🔄 새 셰이더 순열
새로운 셰이더 조합 필요
📺 렌더 타겟 변경
렌더 타겟 포맷 변경 시
PSO Precaching (UE 5.2+)
자동 PSO 수집 및 컴파일
PSO Precaching은 UE 5.2에서 도입되어 5.3 이상에서 프로덕션 레디 상태입니다. 자동으로 PSO를 수집하고 비동기 컴파일합니다.
# 기본 활성화 (DefaultEngine.ini)
r.PSOPrecache.GlobalShaders=1
UE 5.3 이상에서는 PSO Precaching이 기본적으로 활성화됩니다. 별도 설정 없이 스터터링이 감소합니다.
Bundled PSO Cache (레거시)
수동 PSO 캐시 생성
레거시 방식이지만 여전히 유효합니다. 게임 플레이 중 PSO를 기록하고 패키지에 포함합니다.
[DevOptions.Shaders]
ShaderPipelineCache.Enabled=True
ShaderPipelineCache.LogPSO=True
# PSO 기록 파일 위치
# Saved/CollectedPSOs/*.rec.upipelinecache
수동 PSO 수집 워크플로우
- 1단계: PSO 로깅 활성화하고 게임 전체 플레이
- 2단계: 수집된 .rec.upipelinecache 파일 확인
- 3단계: Build 폴더에 포함하여 패키징
- 4단계: 게임 시작/레벨 로드 시 PSO 프리컴파일
히치 감지 및 메모리 관리
PSO 관련 설정
# PSO 컴파일 히치 임계값 (기본 20ms)
r.PSO.RuntimeCreationHitchThreshold=20
# 이 값 이상 걸리면 로그에 경고 출력
메모리 vs 성능 트레이드오프
프리캐시 후 PSO 삭제
메모리 절약. 단점: 첫 렌더링 시 마이크로 스터터 가능
프리캐시된 PSO 유지
스터터링 최소화. 단점: 1GB+ 메모리 증가 가능. RAM 충분한 환경에서만
콘솔 및 고정 사양 환경에서는 PSO 유지, PC 환경에서는 메모리 상황에 따라 선택하세요.
핵심 요약
- PSO: 셰이더 + GPU 상태 패키지, 온디맨드 생성 시 스터터링 원인
- PSO Precaching: UE 5.2+ 자동 수집/컴파일, 5.3+ 프로덕션 레디
- Bundled PSO Cache: 레거시 수동 방식, 전체 플레이로 수집
- 히치 임계값: r.PSO.RuntimeCreationHitchThreshold=20ms
- 메모리 트레이드오프: PSO 유지 vs 삭제 선택
GPU 최적화를 마스터했습니다! 다음 Part에서는 메모리 최적화의 핵심인 Asset 참조, Streaming, 텍스처 관리를 다룹니다.
도전 과제
배운 내용을 직접 실습해보세요
r.ShaderPipelineCache.Enabled=1로 PSO 캐시를 활성화하고 게임의 모든 레벨을 순회하세요. 수집된 PSO 캐시 파일 크기와 엔트리 수를 확인하고, 첫 실행 시 히칭 감소를 측정합니다.
빌드 파이프라인에서 수집된 PSO 캐시를 포함하여 패키징하세요. 새로 설치한 환경에서 게임 시작 시 셰이더 컴파일 히칭이 발생하지 않는지 확인합니다.
자동화된 테스트가 모든 레벨/머티리얼 조합을 순회하여 PSO를 수집하는 커맨드렛을 구현하세요. CI/CD에서 매 빌드마다 PSO 캐시를 갱신하고, 누락된 PSO로 인한 런타임 컴파일을 0건으로 달성합니다.