Version: 2021.3
言語: 日本語
ドローコールのバッチ処理
動的バッチ処理

静的バッチ処理

Static batching is a draw call batching method that combines meshes that don’t move to reduce draw calls. It transforms the combined meshes into world space and builds one shared vertex and index buffer for them. Then, for visible meshes, Unity performs a series of simple draw calls, with almost no state changes between each one. Static batching doesn’t reduce the number of draw calls, but instead reduces the number of render state changes between them.

静的バッチ処理は CPU で頂点を変換しないので、動的バッチ処理 よりも効率的です。静的バッチ処理のパフォーマンスへの影響については、パフォーマンスへの影響 を参照してください。

要件と互換性

このセクションでは、静的バッチ処理とレンダーパイプラインの互換性についての情報を紹介します。

レンダーパイプラインの互換性

機能 ビルトインレンダーパイプライン ユニバーサルレンダーパイプライン (URP) HD レンダーパイプライン (HDRP) カスタムのスクリプタブルレンダーパイプライン (SRP)
静的バッチ処理 あり あり あり あり

静的バッチ処理の使用

Unity はビルド時、ランタイム時に静的バッチ処理を行うことができます。原則として、アプリケーションをビルドする前にゲームオブジェクトがシーンに存在する場合は、エディター を使ってビルド時にゲームオブジェクトをバッチ処理します。ランタイムにゲームオブジェクトとそのメッシュを作成する場合は、ランタイム API を使用します。

ランタイム API を使用すると、静的バッチのルートのトランスフォームプロパティを変更することができます。つまり、静的バッチを構成する結合したメッシュ全体を移動、回転、または拡大縮小することができます。個々のメッシュのトランスフォームプロパティを変更することはできません。

ゲームオブジェクトのセットに対して静的バッチ処理を使用するには、ゲームオブジェクトが静的バッチ処理の対象である必要があります。共通のバッチ処理の使用情報 に記載されている基準に加え、以下を確認してください。

  • ゲームオブジェクトがアクティブである。
  • ゲームオブジェクトは Mesh Filter コンポーネントを持ち、そのコンポーネントは有効である。
  • Mesh Filter コンポーネントには、Mesh への参照がある。
  • The mesh is read/write enabled.
  • メッシュの頂点数が 0 より大きい。
  • そのメッシュがまだ他のメッシュと結合されていない。
  • ゲームオブジェクトは Mesh Renderer コンポーネントを持ち、そのコンポーネントは有効である。
  • Mesh Renderer コンポーネントは、DisableBatching タグが true に設定されているシェーダーを持つ マテリアルを使用しない。
  • まとめてバッチ処理するメッシュは、同じ頂点属性を使用する。例えば、Unity は、互いに頂点位置、頂点法線、1 つの UV を使用するメッシュどおしはバッチ処理できますが、頂点位置、頂点法線、UV0、UV1、頂点正接を使用するメッシュとは一括処理できません。

静的バッチ処理のパフォーマンスへの影響については、パフォーマンスへの影響 を参照してください。

ビルド時の静的バッチ処理

エディターでビルド時に静的バッチ処理を有効にすることができます。

ビルド時に静的バッチ処理を行う場には、以下を行います。

  1. Edit > Project Settings > Player の順に移動します。
  2. Other SettingsStatic Batching を有効にします。
  3. シーンビューまたは Hierarchy で、バッチ処理したいゲームオブジェクトを選択し、Inspector で表示します。
    ヒント: 複数のゲームオブジェクトを同時に選択し、全てのゲームオブジェクトに対して静的バッチ処理を行うことができます。
  4. ゲームオブジェクトの 静的エディターフラグ で、 Batching Static を有効にしてください。

Unity は、共通の使用情報 に記載されている条件を満たす場合、自動的に静的メッシュを同じドローコールでバッチ処理します。

ゲームオブジェクトの Inspector にある静的エディターフラグのチェックボックス
ゲームオブジェクトの Inspector にある静的エディターフラグのチェックボックス

ノート: ビルド時に静的バッチ処理を行うと、Unity はランタイムに CPU リソースを一切使用することなく、静的バッチ用のメッシュデータを生成します。

ランタイムの静的バッチ処理

ランタイムに静的メッシュをバッチ処理するために、Unity はStaticBatchingUtility クラスを提供しています。静的な StaticBatchingUtility.Combine メソッドは、渡されたゲームオブジェクトを結合して、静的バッチ処理の準備をします。これは特に、ランタイムにプロシージャルに生成されたメッシュに有効です。

ビルド時の静的バッチ処理とは異なり、ランタイムのバッチ処理では、Static Batching Player 設定を有効にする必要はありません。この API の使用方法については、StaticBatchingUtility を参照してください。

パフォーマンスへの影響

静的バッチ処理を使用すると、結合されたジオメトリを保存するために追加の CPU メモリが必要になります。複数のゲームオブジェクトが同じメッシュを使用する場合、Unity は各ゲームオブジェクトのメッシュのコピーを作成し、各コピーを結合したメッシュに挿入します。つまり、同じジオメトリが複数回、結合されたメッシュに表示されます。Unity は、エディター またはランタイム API のどちらを使用してゲームオブジェクトを静的バッチ処理用に準備するかに関係なく、この処理を行います。メモリフットプリントを小さくしたい場合は、レンダリングパフォーマンスを犠牲にして、いくつかのゲームオブジェクトの静的バッチ処理を避けることが必要かもしれません。たとえば、密集した森林環境で樹木を静的とマークすると、メモリに深刻な影響を与える可能性があります。

ノート: 1 つの静的バッチに加えることができる頂点の数には制限があります。各静的バッチは最大 64000 個の頂点を含むことができます。それ以上の場合は、別のバッチを作成します。

ドローコールのバッチ処理
動的バッチ処理