PSO 캐싱은 앱에서 가장 자주 사용되는 파이프라인 스테이트 오브젝트(Pipeline State Object) 데이터를 미리 생성하고 저장하여 렌더링 퍼포먼스를 개선하며, 무엇보다 애플리케이션을 실행하는 중 발생하는 히치를 줄여줍니다. 이 가이드에서는 언리얼 엔진(UE)의 Android 프로젝트에서 PSO 캐싱을 구현하는 방법을 안내합니다.
이 페이지에서는 UE 버전 5.2 및 이전 버전에서 사용되는 레거시 수동 PSO 캐싱 시스템인 번들화된 PSO 캐싱 메서드에 대한 지침을 제공합니다. 프로젝트에서 사용할 수 있다면 5.3 이후 버전부터는 PSO 프리캐싱 시스템을 사용하는 것이 좋습니다. 자세한 내용은 PSO 프리캐싱 문서를 참조하세요.
필수 구성
이 가이드를 따라 진행하려면 다음 사항이 필요합니다.
-
Android를 타깃 플랫폼으로 설정한 언리얼 엔진 프로젝트
-
현재 언리얼 엔진 버전과 호환되는 버전의 Android SDK 및 NDK
-
개발자 모드 및 USB 디버깅이 활성화된 호환되는 Android 테스트 디바이스
사용 중인 언리얼 엔진 버전과 호환되는 Android 디바이스에 대해서는 Android 개발 요구 사항에서 확인할 수 있습니다.
PSO 캐싱을 위한 프로젝트 세팅 설정하기
PSO 캐싱을 지원하도록 프로젝트 세팅을 환경설정하려면 다음 단계를 따릅니다.
-
언리얼 에디터에서 프로젝트를 엽니다.
-
편집(Edit) > 프로젝트 세팅(Project Settings) 을 엽니다.
-
프로젝트(Project) > 패키징(Packaging) 으로 이동한 다음 머티리얼 셰이더 코드 공유(Share Material Shader Code) 및 공유된 머티리얼 네이티브 라이브러리(Shared Material Native Libraries) 둘 다 활성화되어 있는지 확인합니다.
-
다음 단계에서는 환경설정 파일을 직접 편집해야 합니다. 수동으로 편집한 내용과 프로젝트 세팅이 서로 상충하지 않도록 언리얼 에디터를 닫습니다.
-
프로젝트의
Config/Android
폴더에서AndroidEngine.ini
를 엽니다. 다음 세팅을 추가합니다.[DevOptions.Shaders] NeedsShaderStableKeys=true
게임 실행 및 PSO 수집하기
이제 프로젝트 세팅이 PSO 캐시와 호환되므로 -logPSO
명령줄을 활성화한 상태로 프로젝트 빌드를 실행합니다.
-
테스트 디바이스가 컴퓨터에 연결되어 있는지 확인합니다.
-
언리얼 에디터에서 프로젝트를 엽니다.
-
플랫폼(Platforms) > 프로젝트 런처(Project Launcher) 를 클릭합니다.
-
프로젝트 런처에서 + 추가(Add) > 커스텀 프로파일 생성(Create Custom Profile) 을 클릭하여 새로운 실행 프로파일을 만듭니다.
-
프로파일 이름을 PSO Caching - ETC2 로 변경합니다.
-
콘텐츠 쿠킹을 어떻게 할까요?(How would you like to cook your content?) 옆에 있는 드롭다운에서 원칙대로 쿠킹(Cook by the Book) 을 선택합니다.
-
Android_ETC2 를 타깃 플랫폼으로 선택합니다.
-
디플로이(Deploy) 아래에서 테스트할 모바일 디바이스를 타깃 디바이스로 선택하고 베리언트(Variant) 를 Android_ETC2 로 설정합니다.
-
실행(Launch) 카테고리 아래에서
-logPSO
명령을 추가 명령줄 파라미터(Additional Command Line Parameters) 에 추가합니다.Android 파일 서버(Android File Server, AFS) 를 사용하여
-logPSO
명령을UECommandLine.txt
파일에 추가함으로써 디바이스의 기존 빌드에 추가할 수 있습니다. 자세한 내용은 AFS 문서를 참조하세요. -
프로파일을 실행합니다. UE는 해당 프로젝트를 빌드하고 패키지로 만든 다음 디바이스에 배포합니다.
-
게임을 플레이합니다. 게임에서 새 PSO를 기록할 때마다 출력 로그(Output Log)에 메시지가 표시됩니다.
향후 PSO 수집 세션을 진행할 때 이 섹션에서 생성한 프로파일을 재사용할 수 있습니다.
PSO 수집 팁
PSO를 수집할수록 최종 앱을 패키지로 만들 때 게임 스타트업 시간이 길어지는데, 사용자가 게임 플레이를 시작하기 전에 모든 PSO를 로드해야 하기 때문입니다. 따라서 일반적으로 자주 사용되고 눈에 띄게 끊김 현상이 발생하는 위치에서만 PSO를 수집하는 것이 좋습니다. 이러한 위치에 대한 PSO 캐시가 사용자 경험 향상에 가장 도움이 되기 때문입니다.
어떤 위치가 크게 변경될 때마다 이전에 수집한 해당 위치의 PSO는 오래된 정보가 됩니다. 따라서 프로덕션 전반에 걸쳐 PSO를 자주 수집해야 합니다.
수집된 PSO 데이터를 디바이스에서 얻기
PSO를 기록한 다음에는 테스트 디바이스에서 데이터를 얻어 새 빌드에 통합해야 합니다. PSO 데이터를 얻으려면 다음 단계를 따릅니다.
-
컴퓨터에서 테스트 디바이스를 분리하고 게임을 종료합니다.
프로젝트 런처에서 게임을 종료하려 하면 디바이스에 기록된 PSO 데이터가 저장되지 않을 수 있습니다.
-
프로젝트를 닫고 테스트 디바이스를 컴퓨터에 다시 연결합니다.
-
다음 디렉터리에서 PSO를 풀합니다.
Internal Storage/Android/Data/[프로젝트 패키지 이름]/files/UnrealGame/[프로젝트 이름]/Saved/CollectedPSOs
다음 메서드 중 하나를 사용하여 CollectedPSOs 디렉터리의 콘텐츠를 풀할 수 있습니다.
* Android 파일 서버(AFS)를 사용하여 다음 명령을 실행합니다.
UnrealAndroidFileTool -p [패키지 이름] -k [보안 토큰] pull ^saved/CollectedPSOs [대상 경로]
* 디바이스를 컴퓨터에 연결하고 컴퓨터의 파일 시스템을 사용하여 PSO의 위치를 찾습니다.
-
.UPIPELINECACHE
파일을 컴퓨터에서 접근이 쉬운 위치에 복사합니다. 이 예시에서는 프로젝트 디렉터리의Import/PSOFiles
라는 폴더를 사용합니다.
최종 PSO 캐시 데이터 빌드 및 프로젝트에 추가하기
PSO 캐시를 빌드에 통합하려면 다음 단계를 따릅니다.
-
프로젝트 폴더를 열고 Saved/Cooked/Android_ETC2/[프로젝트 이름]/Metadata/PipelineCaches 폴더를 찾습니다. 이 폴더의 파일을 Import/PSOFiles에 복사합니다.
-
명령줄 툴을 열고 프로젝트에서 사용하는 엔진 버전의 설치 디렉터리로 이동한 다음, Engine/Binaries/Win64 폴더를 찾습니다. 그 예시는 다음과 같습니다. C:/Program Files/Epic Games/UE_5.2/Engine/Binaries/Win64.
-
다음 명령줄을 실행합니다.
UnrealEditor-Cmd.exe "YourProjectPath.uproject" -run=ShaderPipelineCacheTools expand C:\PSOfiles*.rec.upipelinecache C:\PSOfiles*.shk C:\PSOfiles\"Alias Name"_"Project Name"_"Used Graphics API".spc
-
명령줄이 제대로 실행되면 Import/PSOFiles 디렉터리에 새로운 PKCS #7 인증서 파일이 포함됩니다. 이 파일을 프로젝트의 Build/Android/PipelineCaches 폴더에 복사합니다.
-
게임을 리빌드하고 다시 실행합니다. 새 빌드에는 최종 PSO 캐시 데이터가 포함됩니다.
결과
게임 실행 시 로드된 PSO 개수를 나타내는 로그도 표시됩니다. 게임을 실행하면 PSO를 수집한 위치의 렌더링 끊김 현상이 해결되었을 것입니다.