Version: 2022.1
언어: 한국어
셰이더 배리언트 컬렉션
런타임 시 셰이더 교체

셰이더 로딩

기본적으로 Unity의 런타임 셰이더 로딩 동작은 다음과 같습니다.

  1. Unity는 씬을 로드하거나 런타임 리소스 로딩을 사용하여 콘텐츠를 로드하는 경우, 모든 필수 셰이더 오브젝트를 CPU 메모리에 로드합니다.
  2. 처음으로 셰이더 배리언트를 사용하여 지오메트리를 렌더링해야 할 때 Unity는 해당 배리언트의 데이터를 그래픽스 드라이버에 전달합니다. 그래픽스 드라이버는 GPU에서 해당 배리언트의 표현을 생성하고, 플랫폼이 필요로 하는 추가 작업을 수행합니다.

이 동작의 이점은 셰이더 배리언트에 대해 사전 GPU 메모리 사용 또는 로드 타임이 없다는 것입니다. 반면, 단점은 배리언트가 최초로 사용될 때 그래픽스 드라이버가 GPU에서 셰이더 프로그램을 만들고 추가 작업을 수행해야 하므로 확연한 지연이 있을 수 있다는 것입니다.

셰이더 배리언트 예열

To avoid visible stalls at performance-intensive times, Unity can ask the graphics driver to create GPU representations of shader variants before they’re first needed. This is called prewarming.

You can prewarm in the following ways:

You can also add shader variant collections to the Preloaded shaders section of the Graphics Settings window. Unity uses the ShaderVariantCollection.WarmUp API to load and prewarm the shader variant collections when your built application starts.

Prewarm on DirectX 12, Metal or Vulkan

If you build for DirectX 12, Metal or Vulkan, the graphics driver can only create an accurate GPU representation of a shader variant if it knows the exact vertex data layout and render state. If a prewarmed GPU representation is inaccurate, Unity might still stall when it needs to create the accurate representation.

To create accurate variants and avoid stalling, you should prewarm by rendering Materials off-screen.

또한 다음 방법도 가능합니다.

  • Prewarm a Shader object or shader variant collection using Experimental.Rendering.ShaderWarmup, but only if you can provide the vertex data layout and set the render state accurately.
  • Use ShaderVariantCollection.Warmup or Shader.WarmupAllShaders, which may create inaccurate prewarmed GPU representations because you can’t provide a vertex data layout or render state.

Control how much memory shaders use

In your built application, Unity stores several ‘chunks’ of compressed shader variant data. Each chunk contains multiple shader variants. When Unity loads a scene at runtime, it loads all the scene’s chunks into CPU memory and decompresses them.

To reduce memory usage on platforms that have limited memory, you can limit the size of chunks and how many decompressed chunks Unity keeps in memory.

To do this, in Player settings, select Other Settings > Shader Variant Loading and adjust the following settings:

  • Use Default chunk size (MB) to set the maximum size of compressed chunks Unity stores in your built application.
  • Use Default chunk count to limit how many decompressed chunks Unity keeps in memory. The default is 0, which means there’s no limit.

See PlayerSettings.SetDefaultShaderChunkCount for more information.

You can use Override to override the values for each platform individually. See PlayerSettings.SetShaderChunkCountForPlatform for more information.

You can also use Shader.maximumChunksOverride to override Default chunk count at runtime.

셰이더 로딩용 프로파일러 마커

GPU로 보낼 셰이더 배리언트 데이터의 표현을 만드는 Unity용 프로파일러 마커는 Shader.Parse입니다. 셰이더 프로그램을 GPU에 업로드하고, 필요한 작업을 수행하기 위해 GPU를 기다리는 프로파일러 마커는 CreateGPUProgram입니다.

Unity 프로파일러를 사용하는 방법은 애플리케이션 프로파일링을 참조하십시오.

셰이더 배리언트 컬렉션
런타임 시 셰이더 교체
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961