언리얼 4.27.2버전입니다.
Meta Quest 기기에 적용했습니다.
(참고 사이트)
PSO캐시 수집 밎 적용
https://m.blog.naver.com/gjcka1234/221536629756
UE5 PSO 캐시 적용
https://moris0712.tistory.com/55
셰이더 파이프라인 캐시(PSO캐시) 실전 사용법
https://www.youtube.com/watch?v=5FaN8jK85r0
PSO 캐시 언리얼 엔진 문서
https://docs.unrealengine.com/4.27/ko/SharingAndReleasing/PSOCaching/
PSO에 대해....
첫 쉐이더 컴파일을 할 때, 렉이 걸리는 현상을 히치라고 한다. 이거를 해결하는 방법이 PSO를 적용하는 것이다. 풀네임은 Pipeline Stable Object 이다.
전체적인 흐름
1. .upipelinecache 파일과 .shk 파일을 생성한다.
2. 위에서 생성한 파일 2개로 .csv 파일을 만든다.
3. .csv 파일을 프로젝트 폴더에 넣는다.
4. 빌드하면 pso 적용 끝.
해보자
.upipelinecache 파일을 만들기 위해 해야하는 세팅이다.
프로젝트폴더/Config/DefaultEngine.ini 파일에서 아래 라인을 추가해준다.
[/Script/Engine.RendererSettings]
r.ShaderPipelineCache.Enabled=1
r.ShaderPipelineCache.LogPSO=1
r.ShaderPipelineCache.SaveBoundPSOLog=1
.shk 파일을 만들기 위해 해야하는 세팅이다.
프로젝트폴더/Config/Android/AndroidEngine.ini 파일에서 아래 라인을 추가해주자. 파일이나 폴더가 없으면 만들어준다.
[DevOptions.Shaders]
NeedsShaderStableKeys=true
위 2개를 적용했으면, 빌드해서 플레이를 해본다.
로그를 확인하면 잘 되고 있는지 확인할 수 있다. 언리얼에서 Window -> Developer Tools -> Device Output Log 창을 켜면, PC와 연결한 기기의 로그를 볼 수 있다.
아래는 로그 내용이다. 플레이 하다보면, New Graphics ~~ 라고 뜰텐데, 새로운 걸 만나서 기록한다는 의미이다.
D/UE4 : [2023.06.19-04.10.12:142][ 45]LogRHI: Display: Encountered a new graphics PSO: 2340437082
D/UE4 : [2023.06.19-04.10.12:142][ 45]LogRHI: Display: New Graphics PSO (2340437082) Description: B52C7C2B803C3AE4EE2DED82E7C11307CC49DF5F,1DA0E8C64DA5FAEA9B46322BCA779CEE23E42B00,0000000000000000000000000000000000000000,0000000000000000000000000000000000000000,0000000000000000000000000000000000000000,<0 1 0 0 1 0 0 0 1 0 0 1 0 15 0 1 0 0 1 0 15 0 1 0 0
1 0 15 0 1 0 0 1 0 15 0 1 0 0 1 0 15 0 1 0 0 1 0 15 0 1 0 0 1 0 15 0 0>,<0.000000 0.000000 2 2 0 0>,<1 1 0 7 0 0 0 0 7 0 0 0 255 255>,1,12,12,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,<0 0 3 0 12 0>,<1 0 5 1 8 0>,<1 4 5 2 8 0>,<2 0 12 5 4 0>,<2 0 12 6 4 0>,<2 0 12 7 4 0>,<2 0 12 8 4 0>,<3 0 7 13 0 0>,<4 0 6 3 8 0>,<4
0 6 14 8 0>,<4 4 7 4 8 0>,<4 4 7 15 8 0>,<5 0 3 11 0 0>,<5 0 3 12 0 0>,<0 0 0 0 0 0>,<0 0 0 0 0 0>
D/UE4 : [2023.06.19-04.10.12:142][ 45]LogRHI: Display: Encountered a new graphics PSO: 2741478025
D/UE4 : [2023.06.19-04.10.12:142][ 45]LogRHI: Display: New Graphics PSO (2741478025) Description: 2BF1C105C3B72D39320ABC088AB12221B78CCB9F,0000000000000000000000000000000000000000,0000000000000000000000000000000000000000,0000000000000000000000000000000000000000,0000000000000000000000000000000000000000,<0 1 0 0 1 0 0 0 1 0 0 1 0 15 0 1 0 0 1 0 15 0 1 0 0
1 0 15 0 1 0 0 1 0 15 0 1 0 0 1 0 15 0 1 0 0 1 0 15 0 1 0 0 1 0 15 0 0>,<0.000000 0.000000 2 2 0 0>,<1 1 0 7 0 0 0 0 7 0 0 0 255 255>,1,12,12,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,<0 0 3 0 12 0>,<1 0 5 1 8 0>,<1 4 5 2 8 0>,<2 0 12 5 4 0>,<2 0 12 6 4 0>,<2 0 12 7 4 0>,<2 0 12 8 4 0>,<3 0 7 13 0 0>,<4 0 6 3 8 0>,<4
0 6 14 8 0>,<4 4 7 4 8 0>,<4 4 7 15 8 0>,<5 0 3 11 0 0>,<5 0 3 12 0 0>,<0 0 0 0 0 0>,<0 0 0 0 0 0>
D/UE4 : [2023.06.19-04.10.12:143][ 45]LogRHI: Display: Encountered a new graphics PSO: 3151751488
플레이하고 나오면, 해당 기기의 UE4Game/프로젝트명/프로젝트명/Saved/CollectedPSOs 폴더에 .upipelinecache 파일이 생성된 것을 확인할 수 있다.
.upipelinecache 파일은 해당 기기에 생성된 반면에, .shk 파일은 언리얼 프로젝트 폴더 내에 생성된다. 프로젝트 폴더/Saved/Cooked/플랫폼/프로젝트명/Metadata/PipelineCaches 폴더에 생성된다.
.upipelinecache 파일과 .shk 파일을 생성했으니, 이 파일 2개로 .csv 파일을 만들어보자. 만들 때 필요한 것은 UE4Editor-Cmd.exe 파일이다. Engine/Binaries/Win64 폴더에 있다. UE4Editor-Cmd.exe 파일을 바로가기로 생성한다.
경로를 편하게 지정할 수 있도록 C드라이브 밑에 새 폴더를 만든다. 폴더명은 상관없다. 이 폴더에 아까 생성한 .upipelinecache 파일, .shk 파일, UE4Editor-Cmd.exe 바로가기 파일을 넣어준다.
지금 하는 것의 목적은 .csv 파일을 뽑아내는 것이다. UE4Editor-Cmd.exe 바로가기 파일을 우클릭해서 속성 창을 연다.
대상 위치에 아래 명령어?를 자기 프로젝트에 맞게 수정한 뒤 넣어준다.
"C:\Program Files\Epic Games\UE_4.27\Engine\Binaries\Win64\UE4Editor-Cmd.exe" -run=ShaderPipelineCacheTools expand C:/PSOCache/*.rec.upipelinecache C:/PSOCache/*.shk C:/PSOCache/프로젝트명_GLSL_ES3_1_ANDROID.stablepc.csv
분리해서 보면, 이렇게 생겼다.
"C:\Program Files\Epic Games\UE_4.27\Engine\Binaries\Win64\UE4Editor-Cmd.exe"
-run=ShaderPipelineCacheTools expand
C:/PSOCache/*.rec.upipelinecache
C:/PSOCache/*.shk
C:/PSOCache/프로젝트명_GLSL_ES3_1_ANDROID.stablepc.csv
이제 UE4Editor.Cmd.exe 바로가기 파일을 실행해보면, .stablepc.csv 파일이 생겼을 것이다.
이 파일을 이제 언리얼 프로젝트 폴더의 Build/플랫폼/PipelineCaches 폴더에 넣어준다. 폴더가 없으면 만들어준다. 나같은 경우에는 Android_ASTC지만, Android_ASTC에 넣으면 못 찾고, Android/PipelineCaches 폴더에 넣어야 엔진이 찾을 수 있었다. 왜인진 모르겠다.
언리얼을 켜고, 빌드해서 테스트해보자. 히치가 발생하지 않을 것이다.
위 이미지에서는 파일 이름이 GLSL_ES3_1.ANDROID 인데, 이러면 오류 생긴다... 왜 이런 실수를 했을까!!! GLSL_ES3_1_ANDROID라고 고치니 잘 작동한다. 이름이 다르면 못 찾는다.
와~~
주의점
언리얼 4.27 버전 이전의 버전들은 처음에 생성한 파일 확장자가 .shk가 아니고 .csv라고 한다.
언리얼 5 버전 이후 버전들은 마지막에 생성한 파일 확장자가 .csv가 아니고 .spc라고 한다.
언리얼 5.2 버전 출시 노트를 보니, pso 시스템이 개선되는 것 같다??
https://docs.unrealengine.com/5.2/ko/unreal-engine-5.2-release-notes/
'기타 > Unreal' 카테고리의 다른 글
Unreal Insights 사용하기 (0) | 2023.06.07 |
---|---|
RendorDoc 사용하기 (0) | 2023.06.01 |
언리얼 VR 최적화 삽질하기 (0) | 2023.05.26 |
[Unreal C++] Visual Studio 디버깅하기 (0) | 2021.06.28 |
블루프린트로 만든 예제 C++로 옮겨보기 (0) | 2021.06.23 |