Unityの「Batches(バッチ)」は、SceneビューやGameビューの右上に表示される「Stats」(統計)ウィンドウで確認できる項目の一つです。バッチとは、GPUに送信される描画命令(Draw Call)の単位であり、シーン内での描画パフォーマンスを左右する重要な要素です。
バッチ(Batches)とは?
バッチは、GPUに送られる描画命令のセットを指します。基本的に、各オブジェクトを描画するためには、CPUからGPUへ描画命令が送信されます。この命令の一連がバッチです。
- 1つのバッチは1回の描画コールに相当します。
- バッチが多ければ多いほど、CPUが処理する描画コールが増えるため、CPUの負荷が高まり、最終的にはパフォーマンスの低下に繋がります。
バッチの種類
Unityには、描画を効率化するためにいくつかの種類のバッチング技術があります:
- ダイナミックバッチング(Dynamic Batching)
- サイズが小さく、同じマテリアルを使うメッシュをまとめて、1つのバッチに統合する仕組みです。
- ダイナミックバッチングは自動で行われますが、特定の条件を満たしたオブジェクトに対してのみ適用されます。例えば、1,500頂点未満のメッシュが対象です。
- スタティックバッチング(Static Batching)
- 動かないオブジェクト(Staticオブジェクト)同士をまとめて1つのバッチにする手法です。これにより、描画命令の回数が削減され、パフォーマンスが向上します。
- スタティックバッチングは、オブジェクトに「Static」フラグを設定することで有効になります。これにより、シーン内の動かないオブジェクトは一括して描画されます。
- インスタンシング(GPU Instancing)
- 同じメッシュとマテリアルを使用する複数のオブジェクトを、GPUのインスタンス機能を使って1つのバッチで描画する技術です。これにより、同じオブジェクトを何度も描画する際のコストが削減されます。
- 大量の同じオブジェクトを描画する場合に非常に効果的です。
Batchesを減らすための方法
バッチ数が多すぎるとパフォーマンスに影響を与えるため、可能な限りバッチを減らすことが理想です。これを達成するための方法には以下があります:
- オブジェクトをまとめる
- 同じマテリアルやテクスチャを使うオブジェクトをグループ化し、バッチ数を減らす。MeshBakerなどを使用して、複数のメッシュを一つにまとめることでバッチを削減できます。
- ダイナミックバッチングを有効にする
- 自動で複数の小さなオブジェクトをバッチする機能なので、シーン内のオブジェクトがバッチング可能か確認します。
- スタティックバッチングの利用
- 動かないオブジェクトにStaticフラグを設定して、スタティックバッチングを有効にすることでバッチ数を減らせます。
- GPUインスタンシング
- 同じメッシュやマテリアルを使う大量のオブジェクト(木や岩など)を描画する際は、GPUインスタンシングを使用するとバッチ数を大幅に削減できます。
Stats画面の見方
Unityの「Stats」ウィンドウで「Batches」を確認できますが、他にも重要な項目が表示されます:
- SetPass calls: マテリアルごとの描画パス変更回数。多いとパフォーマンスが低下します。
- Triangles: 現在シーンで描画されている三角形の数。三角形数が多いほど、GPU負荷が増加します。
- Vertices: 描画される頂点数。頂点数もGPUに負担をかける要素です。
まとめ
- Batches(バッチ)はGPUに送られる描画命令の単位で、バッチ数が増えるとCPU負荷が高まり、パフォーマンスが低下します。
- Unityでは、ダイナミックバッチング、スタティックバッチング、GPUインスタンシングを活用することでバッチ数を減らし、パフォーマンスを向上させることが可能です。