画面にジオメトリを描画するために、Unity はグラフィックス API に対してドローコールを送信します。ドローコールはグラフィックス API に対して、何をどのように描画するかを指示します。各ドローコールには、テクスチャ、シェーダー、バッファに関する情報など、グラフィックス API が画面に描画するために必要なすべての情報が含まれています。ドローコールはリソースを消費しますが、多くの場合、ドローコール自体よりも、ドローコールの準備の方に多くリソースが消費されます。
ドローコールに備えるため、CPU はリソースを準備し、GPU の内部設定を変更します。これらの設定はまとめてレンダー状態と呼ばれます。レンダー状態の変更 (別のマテリアルに切り替えるなど) は、グラフィックス API が実行する中で最もリソースを消費する操作です。
レンダー状態の変更はリソースを消費するためそれらを最適化することが重要です。レンダー状態の変更を最適化する主な方法は、レンダー状態の変更の回数を減らすことです。この方法は 2 つあります。
ドローコールとレンダー状態の変更を最適化することは、アプリケーションにとって多くの利点があります。主にフレーム時間が改善されますが、それ以外にも以下のような利点があります。
同じシーンで複数のドローコール最適化メソッドを使用することができますが、Unity のドローコール最適化メソッドには、特定の優先順位があることに注意してください。ゲームオブジェクトに複数のドローコール最適化メソッドを使用するように設定すると、Unity は最も優先度の高いメソッドを使用します。
唯一の例外は、ユニバーサルレンダーパイプライン (URP) または HD レンダーパイプライン (HDRP) の SRP バッチャーです。SRP バッチャーを使用する場合、Unity は SRP バッチャーと互換性があるゲームオブジェクトに対し静的バッチ処理もサポートしています。Unity は、ドローコールの最適化に次の順序で優先順位を付けます。
ゲームオブジェクトを静的バッチ処理に設定すると、Unity がバッチ処理に成功した場合、レンダラーがインスタンシングシェーダーを使用する場合も、ゲームオブジェクトの GPU インスタンシングを無効にします。この場合、Inspector ウィンドウに警告メッセージが表示され、静的バッチ処理を無効にするよう促されます。同様に、Unity がメッシュの GPU インスタンシングを使用できる場合、Unity はそのメッシュの動的バッチ処理を無効にします。