構築したアプリケーションで初めてシェーダーバリアントが使用されると、シーンがスタッターする場合があります。これは、Unity とグラフィックスドライバーがシェーダーバリアントをコンパイルし、コンパイルされたシェーダーコードとそれに関連する GPU 状態でパイプライン状態オブジェクト (PSO) を作成する必要があるためです。
スタッターを軽減するには、シェーダーをコンパイルし、最初に必要になる前に PSO を作成して、グラフィックスドライバーがそれらをディスクにキャッシュできるようにします。これはウォームアップや事前準備、事前調理と呼ばれます。通常は、アプリケーションの起動時やシーンのロード中など、ロード画面の間にウォームアップを行います。
ノート: 一部の API は実験的であり、本番環境では使用できません。API とドキュメントは今後、変更または削除される可能性があります。
DirectX 12、Metal、または Vulkan のシェーダーをウォームアップするには、実験的 GraphicsStateCollection API を使用します。この API は、最新のグラフィックス API が正確な PSO を作成およびキャッシュするために必要な、プロジェクトでランタイムに使用される特定の GPU 状態を収集します。
以下の手順に従ってください。
GraphicsStateCollection.BeginTrace メソッドと GraphicsStateCollection.EndTrace メソッドを使用して、アプリケーションが使用するシェーダーバリアントと GPU 状態を記録します。.graphicsState ファイルとして保存するために、GraphicsStateCollection.SendToEditor API を使用します。.graphicsstate ファイルをロードし、WarmUp API または WarmUpProgressively API を使用してシェーダーバリアントをウォームアップします。どちらの API も、シェーダーバリアントを非同期でウォームアップするために使用できる JobHandle オブジェクトを返します。使用するグラフィックス API ごとに異なる .graphicsstate ファイルを作成する必要があります。
詳細については、GraphicsStateCollection を参照してください。
以下のようにウォームアップを行います。
シェーダーバリアントコレクションをウォームアップするには、以下のいずれかを行います。
ShaderVariantCollection.WarmUp は、ビルドしたアプリケーションの起動時に、シェーダーバリアントのウォームアップに使用されます。Unity とグラフィックスドライバーでシェーダーがコンパイルされ、PSO が作成されるタイミングを確認するには、プロファイラーで以下のプロファイラーマーカーを検索します。
Shader.CreateGPUProgram。CreateGraphicsGraphicsPipelineImpl。