[Unite Seoul 2025] Unity6용 ShaderVariant 가이드(웜업 및 스트리핑)
- 쉐이더 베리언트는 쉐이더 내 키워드 분기를 통해 다양한 구현을 가능하게 합니다. 🔑
- 유니티 6 URP Lit 쉐이더는 모든 피처 포함 시 100만 개 이상 베리언트 생성 가능합니다. 🤯
- 과도한 베리언트는 빌드 시간 증가(예: 5시간 이상) 및 런타임 메모리 사용량 증가(예: 0.5GB)를 야기합니다. ⏳💾
- 베리언트 부족은 외관상 문제(예: 핑크색 에러)를 일으키며,
Strict Shader Variant Matching으로 감지 가능합니다. 🎨🚫
- 사용 중인 베리언트는 프레임 디버거, 프로파일러(
Create GPU Program), 유니티 6의 Graphics State Collection으로 확인합니다. 🔍📊
Create GPU Program 및 Create GPU Pipeline Impl (DX12, Metal, Vulkan)에 의한 웜업 스파이크는 성능 저하의 원인입니다. ⚡️
- DX11/OpenGL ES는
Shader Variant Collection을, DX12/Metal/Vulkan은 유니티 6 Graphics State Collection을 사용해 사전 웜업으로 스파이크를 방지합니다. 🔥🛡️
- 쉐이더 베리언트 스트리핑은 빌드에 포함될 베리언트를 조작하여 빌드 시간과 메모리 사용량을 최적화합니다. ✂️🚀
- 스트리핑 방법은
Shader Keyword Filter (렌더 파이프라인 개발자용)와 IPreprocessShaders (OnProcessShader 콜백, 애플리케이션 개발자용)가 있습니다. 🛠️⚙️
- 실제 사례에서 스트리핑으로 단일 쉐이더 메모리 30MB+ -> 10MB 이하, 빌드 시간 몇 시간 -> 1시간 미만 단축 효과를 보였습니다. ✅📉
- 다이나믹 쉐이더 베리언트 로딩은 쉐이더 바이너리 데이터를 청크 단위로 분할, 필요 시 로드하여 런타임 메모리를 절약합니다. 📦💡
Player Settings에서 Chunk Count와 Chunk Size로 다이나믹 로딩을 제어하며, Chunk Count는 메모리 캐시 유지 개수를 결정합니다. 🔢
Shader.DynamicLoadGPUProgram 프로파일러 이벤트는 청크 로딩 부하를 간접적으로 나타내며, 빈번할 경우 Chunk Count 조정을 고려해야 합니다. 📈🔄
- 이상적인 관리는 필요한 것만 스트리핑 후 웜업하는 것이지만, 대규모 프로젝트에서는 다이나믹 로딩이 현실적인 대안입니다. 🎯⚖️
데브허브 | DEVHUB | [Unite Seoul 2025] Unity6용 ShaderVariant 가이드(웜업 및 스트리핑)