기본적으로 Unity의 런타임 셰이더 로딩 동작은 다음과 같습니다.
이 동작의 이점은 셰이더 배리언트에 대해 사전 GPU 메모리 사용 또는 로드 타임이 없다는 것입니다. 반면, 단점은 배리언트가 최초로 사용될 때 그래픽스 드라이버가 GPU에서 셰이더 프로그램을 만들고 추가 작업을 수행해야 하므로 확연한 지연이 있을 수 있다는 것입니다.
성능이 많이 소요되는 경우, Unity는 확연한 지연을 방지하기 위해 최초로 필요하기 전에 셰이더 배리언트의 GPU 표현을 생성하도록 그래픽스 드라이버에 요청할 수 있습니다.이를 예열이라고 합니다.
다음 방법으로 예열할 수 있습니다.
Graphics Settings 창의 Preloaded shaders 섹션에서 셰이더 배리언트 컬렉션을 추가할 수도 있습니다.Unity는 빌드된 애플리케이션이 시작될 때 ShaderVariantCollection.WarmUp
API를 사용하여 셰이더 배리언트 컬렉션을 로드하고 예열합니다.
DirectX 12, Metal 또는 Vulkan용으로 빌드하는 경우 그래픽스 드라이버는 정확한 버텍스 데이터 레이아웃과 렌더링 상태를 알고 있는 경우에만 셰이더 배리언트의 정확한 GPU 표현을 생성할 수 있습니다.예열된 GPU 표현이 부정확한 경우 정확한 표현을 생성해야 할 때는 Unity가 여전히 지연될 수 있습니다.
정확한 배리언트를 생성하고 지연을 방지하려면 머티리얼을 화면 밖에서 렌더링하여 예열해야 합니다.
또한 다음 방법도 가능합니다.
Experimental.Rendering.ShaderWarmup
을 사용하여 셰이더 오브젝트 또는 셰이더 배리언트 컬렉션을 예열하되, 버텍스 데이터 레이아웃을 제공하고 렌더링 상태를 정확하게 설정할 수 있는 경우에만 이렇게 하십시오.ShaderVariantCollection.Warmup
또는 Shader.WarmupAllShaders
를 사용합니다. 사용자가 버텍스 데이터 레이아웃이나 렌더링 상태를 제공할 수 없기 때문에 이것은 부정확한 예열된 GPU 표현을 생성할 수도 있습니다.빌드된 애플리케이션에서 Unity는 압축된 셰이더 배리언트 데이터의 여러 ’청크’를 저장합니다.각 청크에는 여러 셰이더 배리언트가 포함되어 있습니다.Unity는 런타임에 씬을 로드할 때 해당 씬의 모든 청크를 CPU 메모리에 로드하고 압축을 해제합니다.
메모리가 제한된 플랫폼에서 메모리 사용량을 줄이기 위해 청크의 크기와 Unity가 메모리에 보관하는 압축 해제된 청크의 수를 제한할 수 있습니다.
이렇게 하려면 플레이어 설정에서 Other Settings > Shader Variant Loading을 선택하고 다음 설정을 조정합니다.
0
으로 제한이 없습니다.자세한 내용은 PlayerSettings.SetDefaultShaderChunkCount를 참조하십시오.
Override 를 사용하여 각 플랫폼의 값을 개별적으로 오버라이드할 수 있습니다.자세한 내용은 PlayerSettings.SetShaderChunkCountForPlatform을 참조하십시오.
또한 Shader.maximumChunksOverride를 사용하여 런타임에 Default chunk count 를 오버라이드할 수도 있습니다.
GPU로 보낼 셰이더 배리언트 데이터의 표현을 만드는 Unity용 프로파일러 마커는 Shader.Parse
입니다. 셰이더 프로그램을 GPU에 업로드하고, 필요한 작업을 수행하기 위해 GPU를 기다리는 프로파일러 마커는 CreateGPUProgram
입니다.
Unity 프로파일러를 사용하는 방법은 애플리케이션 프로파일링을 참조하십시오.