シェーダーのロード
デフォルトでは、Unity のランタイムシェーダーのロードの動作は以下の通りです。
- Unity が シーンをロード する、または ランタイムリソースローディング を使用してコンテンツをロードする場合、必要な シェーダーオブジェクト をすべて CPU メモリにロードします。
- Unity が初めてシェーダーバリアントを使ってジオメトリをレンダリングする必要が生じる際に、Unity はそのバリアントのデータをグラフィックスドライバーに渡します。グラフィックスドライバーは、GPU 上にそのバリアントを作成し、プラットフォームが必要とする追加作業を行います。
この動作の利点は、シェーダーバリアントのための GPU メモリ使用量やロー ド時間が前もって発生しないことです。欠点は、グラフィックスドライバーがシェーダープログラムを GPU 上に作成し、追加の作業を行わなければならないため、バリアントが初めて使用されるときに、目に見えるストールが発生することです。
シェーダーのバリアントの事前準備
パフォーマンス集中時の目に見えるストールを避けるために、Unity はグラフィックスドライバーに対して、シェーダーバリアントが最初に必要とされる前に GPU 内に作成するよう指示します。これは 事前準備 と呼ばれます。
注意: 事前準備の実行方法を選択する前に、グラフィックス API のサポートに関する注意事項を確認してください。DX12、Vulkan、Metal などの最新のグラフィック API では、実験的なShaderWarmup API のみが完全にサポートされています。なぜなら、これにより、頂点形式を指定できるからです。他の方法を使うと、ストールを修正することなく、作業と GPU メモリを無駄にすることになります。
以下のような方法で事前準備を行うことができます。
- 実験的な ShaderWarmup API を使用して、与えられたシェーダーオブジェクトまたはシェーダーバリアントコレクションを事前準備します。グラフィックス API のサポートについては、注 1 を参照してください。
- Graphics 設定の Preloaded Shaders セクション にシェーダーバリアントコレクションを加えることによって、アプリケーション起動時に、 それらを事前準備します。グラフィックス API のサポートについては、注 2 を参照してください。
-
ShaderVariantCollection.WarmUp API を使用して、シェーダーバリアントコレクションを事前準備します。グラフィックス API のサポートについては、注 2 を参照してください。
-
Shader.WarmupAllShaders API を使用して、現在メモリ内にあるすべてのシェーダーオブジェクトのすべてのバリアントを事前準備します。グラフィックス API のサポートについては、注 2 を参照してください。
注:
- すべてのグラフィックス API に完全対応しています。
- DX11 と OpenGL では完全にサポートされています。DX12、Vulkan、Metal では一部サポートされています。頂点レイアウトやレンダーターゲットの設定が、事前準備に使用するデータと異なる場合、グラフィックスドライバーによる作業が必要な場合があります。
シェーダーロードのためのプロファイラーマーカー
Unity がシェーダーバリアントデータを作成して GPU に送信するためのプロファイラーマーカーは Shader.Parse です。シェーダープログラムを GPU にアップロードして、GPU が必要な作業を実行するのを待つためのプロファイラマーカーは、CreateGPUProgram です。
Unity Profiler の使用方法については、アプリケーションのプロファイル を参照してください。