언리얼 엔진 5.6에서 모바일에서 PSO Precache을 사용하고 있습니다. 그런데 PSO Precache을 사용하면 Vulkan드라이버에서 크래시가 발생합니다. DefaultEngine.ini에서 bSupportsVulkan 값을 False로 하거나 r.Vulkan.AllowPSOPrecaching 값을 False로 입력하면 크래시가 발생하지 않고 있습니다. 실행 후 바로 크래시가 발생하는 것이 아니라 실행 후 약간 시간이 지나서 크래시가 발생하는데 혹시 해당 상황에 대해 해결할 방법이 있을까요?
현재 옵션 값은 아래와 같이 사용하고 있습니다.
r.PSOPrecaching=1
r.PSOPrecache.Components=1
r.PSOPrecache.Resources=1
r.PSOPrecache.GlobalShaders=1
r.PSOPrecache.GlobalComputeShaders=1
r.Streaming.AllowParallelStreamingRenderAssets=1
r.PSOPrecache.Validation=2
r.PSOPrecache.Validation.TrackMinimalPSOs=1
D/UE : PSO PRECACHING MISS:
D/UE : Type: FullPSO
D/UE : PSOPrecachingState: Missed
D/UE : Material: Unknown
D/UE : VertexFactoryType: None
D/UE : MDCStatsCategory: Unknown
D/UE : GlobalTypeName: SlateGlobalPSOCollector
D/UE : Shader Hashes:
D/UE : VertexShader: C5AE22CA2AA0DF2509BF11C4FCCB81AAB72EE328
D/UE : PixelShader: 8B2E8F706AD8578371BD859958D9971BAFCC74EE
D/UE :
D/UE : No material found so no extra information on miss
D/UE :
D/UE : [2025.08.05-09.04.36:016][ 1]LogEngine:
D/UE :
D/UE : PSO PRECACHING MISS:
D/UE : Type: FullPSO
D/UE : PSOPrecachingState: Missed
D/UE : Material: Unknown
D/UE : VertexFactoryType: None
D/UE : MDCStatsCategory: Unknown
D/UE : GlobalTypeName: SlateGlobalPSOCollector
D/UE : Shader Hashes:
D/UE : VertexShader: C5AE22CA2AA0DF2509BF11C4FCCB81AAB72EE328
D/UE : PixelShader: D68C78B220AA5C2EE41E6A87FA30BFD475C6A237
D/UE :
D/UE : No material found so no extra information on miss
<br/>
해당 크래시가 발생하기 전에 이런 오류가 발생하였는데 해당 오류와 관련이 있는지 잘 모르겠습니다.
안녕하세요.
말씀해주신 사항 관련하여 내부 확인 후 다시 알려드리도록 하겠습니다.
감사합니다.
안녕하세요.
제공해주신 로그와 설정 값으로 재현해본 결과로, 크래시는 EPSOPrecacheResult::Miss State 이후 발생하는 TooLate State로 인해 발생하는 것으로 보입니다.
크래시는 r.PSOPrecache.Validation 옵션을 2로 설정했을 때 호출되는
PSOCollectorStats::CheckMinimalPipelineStateInCache 함수 코드의
check(Result == EPSOPrecacheResult::Missed); 부분에서 문제가 발생합니다.
PSOPrecacheResult가 TooLate인 경우에는 PSO가 필요한 시점이 너무 늦어서 런타임 컴파일을 기다려 줄 시간조차 없어, 렌더링 커맨드가 이미 GPU로 전송되기 직전 단계임에도 필수적인 PSO가 준비되지 않은 상태이기 때문에 의도적으로 크래시를 발생시킵니다.
따라서 r.PSOPrecache.Validation 옵션을 1로 설정하여, 로그를 통해 TooLate가 발생하는 부분을 찾아내는 것을 권장드립니다.
추가적으로, 안드로이드 모바일 환경에서 PSO 관련 안정성을 높이는 데 도움이 될 만한 옵션에 대해 안내해드립니다.
r.Vulkan.EnablePipelineLRUCache=1
해당 옵션은 최근에 안 쓰인 PSO를 우선적으로 비워 파이프라인 및 셰이더 관련 메모리 사용량을 상한 내로 유지시켜, 안드로이드처럼 메모리 제약이 큰 환경에 유용합니다.
더 자세한 내용 및 전체적인 PSO 프리캐싱 워크플로우는 아래 공식 문서를 참고하시면 도움이 될 것 같습니다.
언리얼 엔진의 PSO 프리캐싱 | 언리얼 엔진 5.6 문서 | Epic Developer Community
감사합니다.