✍️

【Unity】バッチ処理とドローコール最適化

2024/12/15に公開

Unityでのパフォーマンス最適化において、バッチ処理とドローコール最適化は重要なポイントです。本記事では、UnityのStatsウィンドウで確認できる情報をもとに、バッチ処理の種類や条件について解説しています。


Statsウィンドウ

主な項目

項目 説明
Batches 実際に発生したドローコールの数。
Saved by batching バッチ処理によって削減された描画コール数。
SetPass Calls シェーダーやマテリアルが切り替わる回数。
Tris(Triangles) 描画される三角形の数。
Verts(Vertices) 描画される頂点の数。

Batches = Draw Calls?

UnityのBatchesは、バッチ処理後の最終的なDraw Callの数に相当します。

上記画像のBatchesが15、Saved by batchingが4の場合:

  • バッチングがなければ19(15 + 4)回の描画命令が発生していたことを表しています。
  • バッチ処理によって4回分が削減され、15回に最適化されています。

バッチ処理とBatchesの関係

バッチ処理は、複数のオブジェクトをまとめて描画することで、描画命令(ドローコール)の回数を削減する技術で、Unityでは、以下の2種類のバッチ処理が用意されています。

1. 静的バッチング(Static Batching)

  • 条件:

    1. Staticフラグが有効になっているオブジェクト。
    2. 同じマテリアルを使用している。
  • 特徴:

    • 動かないオブジェクトをまとめてバッチ処理。
    • ステージや背景の固定オブジェクトに適用します。
  • 最適化のポイント:

    • 背景オブジェクトを「Static」に設定し、マテリアルを統一。

2. 動的バッチング(Dynamic Batching)

  • 条件:

    1. 頂点数が少ないオブジェクト
    2. 同じマテリアルを使用している。
    3. スケールが均等である。
  • 特徴:

    • 動くオブジェクトでも条件を満たしていれば、描画をまとめて処理可能。
    • 頂点数の制限があるため、複雑なモデルには適用されません。
  • 最適化のポイント:

    • モバイルゲームでは、動的バッチングを活用するためにポリゴン数を抑えたモデルを使用。

SetPass Calls とシェーダー切り替え

SetPass Callsは、シェーダーやマテリアルが切り替わる回数を表します。この値が増えると、GPUの負荷が上昇します。

  • 最適化のポイント:
    • できるだけ同じマテリアルとシェーダーを共有する。
    • ライトの影響を受けるオブジェクトを減らす(特にリアルタイムライトの影響)。
    • シェーダー切り替えを減らすために、マテリアルプロパティを活用する。

Tris(Triangles)とVerts(Vertices)

Tris(Triangles/三角形数)

  • Trisは、画面に描画される三角形の数です。
  • カメラに映らない部分の三角形は描画されないため、視界内のポリゴン数が最適化に影響します。

Verts(Vertices/頂点数)

  • メッシュの分割数UV展開法線情報の設定によって頂点数が増加します。

最適化のポイント

  • シンプルなメッシュを使用する。
  • UVや法線を適切に設定して無駄な頂点を削減する。

まとめ

  • 静的バッチング(Static Batching): Staticなオブジェクトをまとめる。
  • 動的バッチング(Dynamic Batching): 動くオブジェクトでも条件を満たせば適用。
  • Batches: ドローコールの数。
  • Saved by batching: バッチ処理で削減されたドローコール数。
  • SetPass Calls: できるだけ同じマテリアルを使用、ライトの数を減らす。
  • TrisとVerts: シンプルなメッシュを使用する。

参考文献

Discussion