Version: 2021.2
言語: 日本語
静的バッチ処理
手動によるメッシュの結合

動的バッチ処理

動的バッチ処理は、移動するゲームオブジェクトをバッチ処理して ドローコール を削減する ドローコールのバッチ処理 方法です。メッシュと パーティクルシステム のようなランタイムに動的に生成されるジオメトリとでは、動的バッチ処理は異なります。メッシュと動的ジオメトリの内部的な違いについては、メッシュの動的バッチ処理動的に生成されたジオメトリの動的バッチ処理 を参照してください。

ノート: メッシュの動的バッチ処理は、古いローエンドデバイスでのパフォーマンスを最適化するために設計されました。最近の消費者向けハードウェアでは、動的バッチ処理が CPU で行う作業が、ドローコールのオーバーヘッドよりも大きくなることがあります。これはパフォーマンスに悪影響を及ぼします。詳細については、メッシュの動的バッチ処理 を参照してください。

要件と互換性

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

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

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

動的バッチ処理の使用

Unity では、パーティクルシステムなどの動的ジオメトリには常に動的バッチ処理を使用します。

メッシュに動的バッチ処理を使う場合は以下を行います。

  1. Edit > Project Settings > Player の順に移動します。
  2. Other Settings で、Dynamic Batching を有効にします。

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

メッシュの動的なバッチ処理

メッシュの動的バッチ処理は、GPU ではなく CPU ですべての頂点をワールド空間に変換して行われます。つまり、動的バッチ処理が最適化となるのは、変換作業がドローコールを行うよりもリソースを消費しない場合のみです。

ドローコールのリソース要件は、多くの要因、主にグラフィックス API に依存します。例えば、コンソールや Apple Metal のような最新の API では、一般にドローコールのオーバーヘッドははるかに低く、多くの場合、動的バッチ処理ではパフォーマンスの向上は望めません。アプリケーションで動的バッチ処理を使用することが有益かどうかを判断するには、動的バッチ処理を使用した場合と使用しない場合で、アプリケーションを プロファイル してください。

シャドウパスに必要なマテリアル値が同じである限り、マテリアルが異なっていてもシャドウキャスターの動的バッチ処理が使用可能です。例えば、複数の木箱に異なるテクスチャを持つマテリアルを使用することができます。マテリアルのアセットが異なっていても、その違いはシャドウキャスターパスには関係なく、影のレンダリング段階で木箱のゲームオブジェクトの影をバッチ処理することができます。

制限

以下のシナリオでは、Unity は動的バッチ処理を全く使えない、または限定的にしか適用できません。

  • Unity can’t apply dynamic batching to meshes that contain more than 900 vertex attributes and 300 vertices. This is because dynamic batching for meshes has an overhead per vertex. For example, if your shader uses vertex position, vertex normal, and a single UV, then Unity can batch up to 300 vertices. However, if your shader uses vertex position, vertex normal, UV0, UV1, and vertex tangent, then Unity can only batch 180 vertices.
  • Unity can’t apply dynamic batching to GameObjects that contain mirroring in their Transform component. For example, if one GameObject has a scale of 1 and another GameObject has a scale of –1, Unity can’t batch them together.
  • ゲームオブジェクトがさまざまなマテリアルのインスタンスを使用すると、たとえ基本的に同じものであっても、まとめてバッチ処理できません。シャドウキャスターのレンダリングは唯一の例外です。
  • ライトマップをもつゲームオブジェクトには追加のレンダラーパラメーターが含まれます。つまり、ライトマップされたゲームオブジェクトをバッチ処理したい場合は、同じライトマップの位置を示す必要があります。
  • Unity は、マルチパスシェーダーを使用するゲームオブジェクトに動的バッチ処理を完全に適用することはできません。
    • ほぼすべての Unity シェーダーは、フォワードレンダリングで複数のライトをサポートします。これを実現するために、シェーダーは、各ライトに対して追加のレンダーパスを処理します。Unity は最初のレンダーパスのみをバッチ処理します。追加のピクセル単位のライトのドローコールをバッチ処理することはできません。
    • 古いディファードレンダリングパス は 2 つのレンダーパスでゲームオブジェクトを描画するため、動的バッチ処理をサポートしません。最初のパスはライトプリパスで、2 番目のパスがゲームオブジェクトをレンダリングします。

動的に生成されるジオメトリの動的バッチ処理

以下のレンダラーは、パーティクルやラインなどのジオメトリを動的に生成し、動的バッチ処理を用いて最適化することができます。

動的に生成されたジオメトリに対する動的バッチ処理は、メッシュに対するものとは異なる動作をします。

  1. 各レンダラーに対し、Unity は、動的にバッチ処理可能なすべてのコンテンツを 1 つの大きな頂点バッファに構築します。
  2. レンダラーはバッチ処理のためのマテリアルの状況を設定します。
  3. その後、Unity は頂点バッファを GPU にバインドします。
  4. バッチ処理の各レンダラーごとに、Unity は頂点バッファのオフセットを更新し、新しいドローコールを送信します。

この方法は、Unity が 静的バッチ処理 のためにドローコールを送信する方法と似ています。

静的バッチ処理
手動によるメッシュの結合