데브허브 | DEVHUB | Managing Unbounded Growth: A Story of Shaders in UE | Unreal Fest Stockholm 2025Managing Unbounded Growth: A Story of Shaders in UE | Unreal Fest Stockholm 2025
- 언리얼 엔진의 셰이더 시스템은 끝없이 증가하는 셰이더 수로 인해 막대한 컴파일 시간과 워크플로우 중단을 겪고 있습니다. 💥
- 2022년 중반, 내부 프로젝트의 쿡(Cook) 시간이 타임아웃되는 등 심각한 문제에 직면했으며, 이는 QA 빌드 및 콘텐츠 제작에 큰 지장을 초래했습니다. ⏱️
- 잦은 셰이더 코드 변경, 특히 사소한 주석 변경조차도 전체 셰이더 드라이브 데이터 캐시(DDC)를 무효화하여 모든 셰이더를 재컴파일하게 만들었습니다. 🔄
- 임시 해결책으로 '셰이더 제출 금요일'이나 별도 개발 스트림 운영을 시도했으나, 비효율적이고 지속 불가능했습니다. 🩹
- 셰이더는 크게 글로벌 셰이더와 머티리얼 셰이더로 나뉘며, 대규모 프로젝트에서는 콘텐츠 의존적인 머티리얼 셰이더가 컴파일 시간의 대부분을 차지합니다. 🎨
- 셰이더 수 증가는 머티리얼 수, 버텍스 팩토리, 셰이더 타입, 셰이더 포맷의 조합으로 발생하며, 특히 머티리얼과 셰이더 타입은 지속적으로 증가하는 경향이 있습니다. 🧩
- 스태틱 스위치(Static Switch)는 각 불리언 스위치마다 셰이더 수를 최대 2배까지 증가시킬 수 있는 주요 원인이며, 현대 하드웨어에서는 동적 분기 비용이 과거만큼 높지 않으므로 신중한 사용과 프로파일링이 권장됩니다. 💡
- 언리얼 엔진은 중복 셰이더 컴파일을 줄이기 위해 매칭되는 머티리얼 인스턴스 공유, 동일한 코드/설정의 컴파일 작업 공유, 그리고 동일한 바이트코드 출력의 단일 저장 등 여러 수준의 중복 제거를 수행합니다. ♻️
- 엔진 변경 없이 셰이더 수를 관리하는 전략으로는 기본 머티리얼 수를 엄격하게 관리하고 머티리얼 인스턴스를 선호하는 것, 그리고 스태틱 스위치 대신 유니폼 파라미터를 사용하는 것을 제안합니다. 🛠️
- 현재 머티리얼 트랜슬레이터는 유니폼 파라미터를 사용한 동적 분기를 잘 처리하지 못하지만, 새로운 머티리얼 트랜슬레이터는 이 문제를 개선할 예정입니다. 🚀