Version: 2022.1
言語: 日本語
シェーダーバリアントコレクション
ランタイムのシェーダーの置き換え

シェーダーのロード

デフォルトでは、Unity のランタイムシェーダーのロードの動作は以下の通りです。

  1. Unity が シーンをロード する、または ランタイムリソースローディング を使用してコンテンツをロードする場合、必要な シェーダーオブジェクト をすべて CPU メモリにロードします。
  2. Unity が初めてシェーダーバリアントを使ってジオメトリをレンダリングする必要が生じる際に、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.

シェーダーロードのためのプロファイラーマーカー

Unity がシェーダーバリアントデータを作成して GPU に送信するためのプロファイラーマーカーは Shader.Parse です。シェーダープログラムを GPU にアップロードして、GPU が必要な作業を実行するのを待つためのプロファイラマーカーは、CreateGPUProgram です。

Unity Profiler の使用方法については、アプリケーションのプロファイル を参照してください。

シェーダーバリアントコレクション
ランタイムのシェーダーの置き換え
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961