Unity 비동기 셰이더 컴파일 가이드
이 문서는 Unity의 비동기 셰이더 컴파일 기능에 대한 개요와 활용 방법을 설명합니다. 비동기 셰이더 컴파일을 통해 셰이더 배리언트를 보다 효율적으로 관리하고 성능을 개선할 수 있습니다.
비동기 셰이더 컴파일 개요
비동기 셰이더 컴파일은 복잡한 셰이더 오브젝트에 대해 Unity 에디터에서 배경으로 셰이더 컴파일을 수행할 수 있게 해줍니다. 이를 통해 셰이더 배리언트를 온디맨드 방식으로 컴파일하여 임포트 프로세스의 지연을 줄일 수 있습니다.
작동 방식
- 에디터가 컴파일되지 않은 셰이더 배리언트를 처음 발견할 때, 해당 배리언트를 작업 스레드의 대기열에 추가합니다.
- 컴파일 중에는 프로그래스 바가 표시되며, 컴파일이 완료될 때까지 플레이스홀더 셰이더로 지오메트리를 렌더링합니다.
예외 상황
DrawProcedural또는CommandBuffer.DrawProcedural을 사용하여 그릴 경우, 플레이스홀더 셰이더가 아닌 해당 지오메트리에 대한 렌더링을 건너뜁니다.- 비동기 컴파일은 Blit 작업과 함께 사용되지 않습니다.
비동기 셰이더 컴파일 활성화
비동기 셰이더 컴파일은 기본적으로 활성화되어 있습니다. 설정을 변경하려면 다음 단계를 따릅니다:
- Unity 에디터 메뉴에서
Edit > Project Settings > Editor로 이동합니다. - Shader Compilation 섹션에서
Asynchronous Shader Compilation체크박스를 선택하거나 해제합니다.
특정 렌더링 호출에 대한 비동기 셰이더 컴파일
C# 스크립트를 사용하여 특정 렌더링 커맨드에 대해 비동기 셰이더 컴파일을 활성화 또는 비활성화할 수 있습니다.
즉각적인 범위
// Store the current state
bool oldState = ShaderUtil.allowAsyncCompilation;
// Disable async compilation
ShaderUtil.allowAsyncCompilation = false;
// Your rendering code
Graphics.RenderMesh(...);
// Restore the old state
ShaderUtil.allowAsyncCompilation = oldState;
CommandBuffer 범위
// Create the CommandBuffer
CommandBuffer cmd = new CommandBuffer();
// Disable async compilation for subsequent commands
ShaderUtil.SetAsyncCompilation(cmd, false);
// Your rendering commands
cmd.DrawMesh(...);
// Restore the old state
ShaderUtil.RestoreAsyncCompilation(cmd);
특정 셰이더 오브젝트용 비동기 컴파일 비활성화
특정 셰이더 오브젝트에 대해 동기식 컴파일을 강제하려면, 셰이더 소스 코드에 #pragma editor_sync_compilation 지시문을 추가합니다.
비동기 셰이더 컴파일 감지
C# API를 사용하여 비동기 셰이더 컴파일의 상태를 모니터링하고, 상태가 변경될 경우 적절한 동작을 수행할 수 있습니다. 예를 들어, 렌더링 중 데이터가 오염되는 것을 방지하기 위해 컴파일 완료를 기다렸다가 데이터를 다시 생성할 수 있습니다.
컴파일 상태 확인
ShaderUtil.IsPassCompiled를 사용하여 특정 셰이더 배리언트의 컴파일 상태 확인ShaderUtil.anythingCompiling으로 현재 셰이더 배리언트가 컴파일 중인지 확인
고급 렌더링 및 비동기 셰이더 컴파일
고급 렌더링을 수행할 경우, 비동기 셰이더 컴파일로 인해 데이터 오염이 발생할 수 있습니다. 이를 방지하기 위해 다음과 같은 방법을 사용할 수 있습니다:
- 비동기 셰이더 컴파일 비활성화
- 특정 렌더링 호출 비활성화
- 특정 셰이더 오브젝트 비활성화
- 데이터 오염 감지 후 데이터 재생성
커스텀 에디터 툴 및 비동기 셰이더 컴파일
기본적으로 비동기 셰이더 컴파일은 게임 뷰와 씬 뷰에서만 작동합니다. 커스텀 에디터 툴을 사용하려면, 특정 렌더링 호출을 위한 비동기 셰이더 컴파일을 활성화하고, 수동으로 컴파일을 트리거하여 사용할 수 있습니다.
결론
Unity의 비동기 셰이더 컴파일 기능을 사용하면 셰이더 배리언트를 효율적으로 관리하고, 게임 성능을 향상시킬 수 있습니다. 위에서 설명한 방법을 활용하여 프로젝트에 적용해보세요.