Unreal Engine PSO 캐시, 셰이더 끊김과 첫 실행 컴파일을 줄이는 법

게임 개발용 그래픽 캐시와 렌더링 장치를 점검하는 현실적인 작업 장면

AI를 활용하여 생성한 이미지입니다.

Unreal Engine 게임에서 첫 실행이나 새 지역에 들어갈 때 화면이 잠깐 멈추는 현상은 셰이더 컴파일과 PSO(Pipeline State Object) 준비가 겹쳐서 나타날 수 있어요. 이 문제를 “그래픽 옵션을 낮추면 해결된다”로만 처리하면 개발 빌드에서 수집한 캐시와 실제 플레이어가 소비하는 캐시의 역할을 놓치게 됩니다. Unreal의 오래된 FShaderCache와 현재 FShaderPipelineCache는 비슷해 보여도 운영 흐름이 달라요.[1][2]

셰이더 캐시와 PSO 캐시를 구분해요

구분 주요 역할 확인할 시점
FShaderCache 셰이더 사용 기록과 캐시 생성 개발 환경에서 수집할 때
FShaderPipelineCache PSO 로깅·직렬화·사전 컴파일 패키징·첫 실행·로딩 구간
사용자 캐시 플레이어 환경에서 누적되는 쓰기 가능 파일 실행 후 재현 비교
콘텐츠 캐시 게임이 제공하는 초기·시드 데이터 배포 패키지 검증

Epic 문서에서 FShaderPipelineCache는 FShaderCache를 대체하는 PSO 로깅·직렬화·사전 컴파일 메커니즘으로 설명됩니다. 쓰기 가능한 캐시는 사용자 Saved 디렉터리에 저장되고, 게임은 Content 디렉터리에 초기 데이터나 시드 데이터를 제공할 수 있어요.[2]

1. 개발 머신에서 기록을 만들어요

FShaderCache 문서는 개발 머신에서 r.UseShaderCachingr.UseShaderDrawLog을 켜 캐시를 채우고, 플레이어 쪽에서는 r.UseShaderCachingr.UseShaderPredraw로 소비하는 흐름을 설명합니다.[1] 여기서 중요한 점은 개발용 기록과 사용자용 소비 설정을 같은 것으로 취급하지 않는 거예요.

재현 테스트를 시작할 때는 맵, 해상도, RHI, 그래픽 프리셋, 카메라 동선을 고정하세요. 아무 장면이나 돌아다니며 만든 캐시는 실제 플레이 경로를 충분히 덮지 못할 수 있습니다. 반대로 모든 조합을 한 번에 수집하려고 하면 캐시 크기와 검증 비용이 커져 어느 장면에서 효과가 있었는지 알기 어려워져요.

r.UseShaderCaching 1
r.UseShaderDrawLog 1

위 값은 개발 측 기록을 위한 예시입니다. 프로젝트의 엔진 버전과 렌더링 경로에 맞는 콘솔 변수 지원 여부를 확인한 뒤 사용하세요. 공식 문서에 없는 값을 임의로 추가하거나, Shipping 빌드에 개발용 기록 옵션을 그대로 넣지는 마세요.

2. PSO 사전 컴파일의 위치를 확인해요

FShaderPipelineCache는 생성된 로그를 병합한 뒤 플랫폼에 맞는 캐시를 게임 콘텐츠에 넣는 흐름을 제공합니다. Epic API 문서는 UnrealEd의 MergeShaderPipelineCaches로 개발 기록을 병합하고, 관련 플랫폼용 결과를 Game Content에 패키징할 수 있다고 설명합니다.[2]

  1. 대표 플레이 경로에서 PSO 기록을 수집합니다.
  2. 개발 머신 간 기록을 병합합니다.
  3. 대상 플랫폼과 RHI가 맞는지 확인합니다.
  4. 패키지에 들어간 캐시 파일이 실제 빌드에 포함됐는지 검사합니다.
  5. 빈 캐시, 잘못된 플랫폼 캐시, 오래된 캐시를 구분해 제거합니다.

캐시 파일이 존재하는 것만으로 적용됐다고 보지 마세요. 첫 실행의 컴파일 시간, 로딩 화면의 멈춤 구간, 이후 같은 장면 재진입 시간을 같은 빌드에서 비교해야 합니다. 캐시를 추가했는데 첫 실행이 그대로라면 파일이 누락됐거나, RHI·셰이더 변경으로 캐시가 무효화됐거나, 해당 경로가 수집 목록에 없을 수 있어요.

3. 사용자 캐시를 지울 때의 기준

사용자 Saved 디렉터리의 쓰기 가능한 캐시는 플레이 중 새 상태를 남길 수 있습니다.[2] 문제 재현을 위해 이 캐시를 지우는 것은 도움이 되지만, 지운 뒤 첫 실행이 느려지는 것은 정상적인 초기 조건일 수 있어요. “캐시 삭제 후 한 번 느려졌다”는 결과와 “캐시가 계속 재생성되어 매번 멈춘다”는 결과를 나눠 기록하세요.

패치나 엔진 업그레이드 뒤 문제가 시작됐다면 이전 캐시를 새 빌드가 그대로 사용할 수 있는지 확인합니다. 셰이더 코드, 머티리얼, RHI, 플랫폼 설정이 바뀌었는데 이전 캐시를 남겨두면 효과가 없거나 재생성 비용만 늘 수 있어요. 다만 사용자 파일을 자동으로 삭제하는 기능을 넣기 전에 복구와 안내 절차를 마련해야 합니다.

증상별로 보는 원인

증상 가능성 검증 방법
첫 실행만 느림 초기 캐시 생성 두 번째 실행과 같은 경로 비교
특정 맵에서 반복 멈춤 수집되지 않은 PSO 대표 동선 기록과 캐시 병합 확인
패치 뒤 전체가 다시 컴파일 셰이더·RHI 변경 빌드·플랫폼별 캐시 비교
캐시가 있어도 효과 없음 패키징·플랫폼 불일치 Content 포함 여부와 대상 RHI 검사

출시 전 체크리스트

  • 개발 기록과 플레이어 소비 설정을 분리하기
  • 대표 맵과 실제 동선에서 PSO를 수집하기
  • 플랫폼·RHI별 캐시를 섞지 않기
  • 병합한 캐시가 패키지에 포함됐는지 검사하기
  • 캐시 삭제 후 첫 실행과 두 번째 실행을 따로 측정하기
  • 엔진·셰이더 변경 시 캐시 유효성을 다시 판단하기

Unreal 프로젝트의 로컬·공유 Derived Data Cache를 정리하는 방법은 Unreal Engine DDC 정리와 셰이더 끊김 구분하기에서 이어서 확인할 수 있어요. DDC와 PSO 캐시는 이름이 비슷해도 저장 위치와 재생성 시점이 다르므로 따로 관리해야 합니다.

Sources

함께 읽을 글