ダイナミックバッチングの使用¶
ダイナミックバッチングは、互換性のあるメッシュをバッチにグループ化してそれらのレンダリングデータを結合することで、Kanzi がより少ないドローコールで複数のメッシュをレンダリングできるようにします。
ドローコールを削減すると、レンダリングコマンドの送信やレンダリングステートの変更にかかる CPU オーバーヘッドを低減でき、互換性のあるメッシュが多数含まれるシーンでレンダリングパフォーマンスが向上します。
ダイナミックバッチング自体も CPU 処理を伴います。特に、バッチの再構築は CPU 負荷を増加させる可能性があるため、オブジェクトが頻繁に作成または破棄されるコンテンツにはダイナミックバッチングが適さない場合があります。
ダイナミックバッチングを使用するには、バッチ処理したいメッシュでダイナミックバッチングを有効にし、ダイナミックバッチングのレンダーパスを設定し、バッチサイズを設定して、バッチ処理されるメッシュが使用するシェーダーを対応させます。
ダイナミックバッチングを使用するには、以下を行う必要があります:
バッチ処理するメッシュの Dynamic Batching プロパティを有効にします。
それらのメッシュを動的バッチ処理のレンダーパスでレンダリングします。
バッチ内のオブジェクトの最大数に基づいて Batch Uniform Count を設定します。
バッチ処理するメッシュが使用するシェーダーを、手動で、または Kanzi Studio のシェーダー変換ツールを使用して適合させます。
パフォーマンスの例¶
Android 12 (SM8475 / Adreno 730) を搭載したデバイスでのテストでは、動的バッチ処理を有効にすると、アプリケーションの平均 CPU 使用率が約 27.8% 減少し、フレームレートは約 30 FPS を維持しました。
2 回の実行はそれぞれ約 300 秒間で、フレームレートの上限を 30 FPS とし、TAA、MSAA、および Idle を無効にしました。動的バッチ処理なしの実行には 150 サンプル、動的バッチ処理ありの実行には 133 サンプルが含まれています。表にはサンプルの平均値を示します。
指標 |
動的バッチ処理なし |
動的バッチ処理あり |
|---|---|---|
アプリケーションの CPU 使用率 (100% = CPU 1 コア) |
24.43% |
17.64% |
フレームレート |
29.98 FPS |
29.99 FPS |
GPU Busy |
67.74% |
69.14% |
プロファイラが報告したグラフィックスメモリ |
1087.30 MB |
1092.83 MB |
このテストでの主な利点は、同じフレームレートでアプリケーションの CPU 使用率が低下したことです。GPU Busy は 1.40 パーセントポイント増加し、報告されたグラフィックスメモリは 5.53 MB 増加しました。結果はシーンとターゲットデバイスによって異なります。動的バッチ処理によってパフォーマンスが向上するかどうかを判断するには、コンテンツをプロファイリングしてください。
動的バッチ処理の条件と制限事項¶
動的バッチ処理は、レンダリングプロパティに基づいてメッシュをグループ化します。一部のプロパティはメッシュを同じバッチに入れられるかどうかを決定し、一貫した頂点アトリビュートは追加の処理を減らすのに役立ちます。
マテリアル (Material)¶
動的バッチ処理は、マテリアル名でメッシュをグループ化します。マテリアルの名前が同じメッシュは、他のバッチ処理の条件も満たしている場合に、同じバッチの対象となります。
ブレンドモード¶
1 つのバッチ内のすべてのメッシュは、同じブレンドモードを使用する必要があります。
オペイクメッシュとトランスパレントメッシュは別々のバッチにしてください。たとえば、オペイクメッシュとトランスパレントメッシュに別々のタグまたはオブジェクトソースを使用します。
Tag Filter の使用 を参照してください。
頂点アトリビュート¶
最良の結果を得るには、バッチ内のすべてのメッシュに同じ頂点アトリビュートを使用してください。
バッチ内のメッシュの頂点アトリビュートが異なる場合、動的バッチ処理は頂点アトリビュートの数が最も多いメッシュを標準メッシュとして使用します。
バッチ内のその他のメッシュについては次のようになります。
標準メッシュにあって他のメッシュにない頂点アトリビュートがある場合、動的バッチ処理はそのメッシュにそのアトリビュートを作成し、
0で埋めます。他のメッシュにあって標準メッシュにない頂点アトリビュートがある場合、動的バッチ処理はそのアトリビュートを破棄します。
追加の処理を減らし、頂点データの破棄を避けるには、同じバッチ内のメッシュに一貫した頂点アトリビュートを使用してください。2 セットのテクスチャ座標を使用するメッシュなど、特殊な頂点アトリビュート要件を持つメッシュについては、動的バッチ処理を無効のままにすることを検討してください。
メッシュの最適化 を参照してください。
サポートされていないメッシュ¶
動的バッチ処理は以下をサポートしていません。
スキンメッシュ。
モーフィングを使用するメッシュ。
これらのメッシュでは Dynamic Batching を有効にしないでください。
ダイナミックバッチングの設定¶
メッシュのダイナミックバッチングの有効化¶
メッシュのダイナミックバッチングを有効にするには、以下の手順に従います。
バッチ処理するメッシュを選択します。
Properties で Dynamic Batching プロパティを有効にします。
Dynamic Batching はデフォルトで無効になっています。
Dynamic Batching が有効になっているメッシュのみがダイナミックバッチングの対象になります。
ダイナミックバッチングレンダーパスの選択¶
Kanzi は、以下のダイナミックバッチングレンダーパスを提供します。
ダイナミックバッチングレンダーパス (Dynamic Batching Render Pass)
ダイナミックバッチング UBO レンダーパス (Dynamic Batching UBO Render Pass)
ダイナミックバッチングウィズマテリアルレンダーパス (Dynamic Batching With Material Render Pass)
ダイナミックバッチング UBO ウィズマテリアルレンダーパス (Dynamic Batching UBO With Material Render Pass)
ダイナミックバッチングノードリストレンダーパス (Dynamic Batching Node List Render Pass)
ドローオブジェクトレンダーパス (Draw Objects Render Pass) の代わりに Dynamic Batching Render Pass または Dynamic Batching UBO Render Pass を使用します。
ドローオブジェクトウィズマテリアルレンダーパス (Draw Objects With Material Render Pass) の代わりに Dynamic Batching With Material Render Pass または Dynamic Batching UBO With Material Render Pass を使用します。With Material バリアントは、通常のドローオブジェクトウィズマテリアルレンダーパスと同じ方法で設定します。
通常のバリアントと UBO バリアントの主な違いは、シェーダーがバッチデータを格納および受け取る方法です。
ダイナミックバッチングレンダーパスの使用¶
- メッシュごとのバッチデータを通常のユニフォーム配列に格納する場合は、Dynamic Batching Render Pass を使用します。
よりシンプルなシェーダーデータレイアウトを使用したい場合。
バッチで使用するメッシュごとのデータ量が比較的少ない場合。
バッチデータをユニフォームバッファオブジェクトに格納する必要がない場合。
UBO ダイナミックバッチングを使用する特別な理由がない場合は、Dynamic Batching Render Pass を使用してください。
ダイナミックバッチング UBO レンダーパスの使用¶
Dynamic Batching UBO Render Pass は、ダイナミックバッチングのデータをユニフォームバッファオブジェクト (UBO) に格納します。
- 以下の場合は、Dynamic Batching UBO Render Pass の使用を検討してください。
バッチデータをユニフォームブロックに保持したい場合。
シェーダーに、バッチごとに更新されるデータがより多く含まれている場合。
ターゲットデバイスでのプロファイリングにより、UBO パスの方がレンダリングのワークロードに適していることがわかった場合。
通常のバリアントと UBO バリアントの主な違いは、シェーダーのデータレイアウトです。
Dynamic Batching Render Pass と Dynamic Batching With Material Render Pass は、通常のユニフォーム配列を使用します。
Dynamic Batching UBO Render Pass と Dynamic Batching UBO With Material Render Pass は、
DynamicBatchUBOユニフォームブロックを使用します。
パフォーマンスが重要なプロジェクトでは、ターゲットデバイスで両方の方法をプロファイリングし、コンテンツに対してより優れたパフォーマンスを発揮する方を使用してください。
With Material バリアントと Node List バリアントの使用¶
ドローオブジェクトウィズマテリアルレンダーパス (Draw Objects With Material Render Pass) に相当するダイナミックバッチングが必要な場合は、Dynamic Batching With Material Render Pass を使用します。
UBO バリアントには Dynamic Batching UBO With Material Render Pass を使用します。
これらのレンダーパスは、通常のドローオブジェクトウィズマテリアルレンダーパス (Draw Objects With Material Render Pass) と同じ方法で設定します。
レンダーパスツリーでノードリストレンダーパス (Node List Render Pass) を使用してダイナミックバッチング用のメッシュを収集している場合は、それを Dynamic Batching Node List Render Pass に置き換えます。通常のノードリストレンダーパスと同じ方法で設定します。
これらのメッシュのレンダーパスツリーでノードリストレンダーパス (Node List Render Pass) を使用していない場合は、この変更を行う必要はありません。
With Material バリアントでは、動的バッチ処理、バッチユニフォーム数、およびシェーダーの要件が、対応する動的バッチ処理レンダーパスと同じです。
レンダーパスを設定する¶
動的バッチ処理用にレンダーパスを設定するには:
メッシュをレンダリングするレンダーパスを、対応する動的バッチ処理レンダーパスに置き換えます。
ドローオブジェクトレンダーパス (Draw Objects Render Pass) を、通常の動的バッチ処理の場合は Dynamic Batching Render Pass に、UBO 動的バッチ処理の場合は Dynamic Batching UBO Render Pass に置き換えます。
Draw Objects With Material Render Pass を、通常の動的バッチ処理の場合は Dynamic Batching With Material Render Pass に、UBO 動的バッチ処理の場合は Dynamic Batching UBO With Material Render Pass に置き換えます。
With Material バリアントは、通常の Draw Objects With Material Render Pass と同じ方法で設定します。
動的バッチ処理レンダーパスで、Object Source を、バッチ処理するメッシュを収集するオブジェクトソースに設定します。
たとえば、タグフィルタ (Tag Filter) を使用してメッシュを収集します。Tag Filter の使用 を参照してください。
注釈
Dynamic Batching が有効になっているメッシュは、動的バッチ処理レンダーパスでレンダリングする必要があり、そのメッシュが使用するマテリアルのシェーダーは動的バッチ処理をサポートしている必要があります。通常のドローオブジェクトレンダーパスがそのようなメッシュを収集した場合、メッシュはプレビュー (Preview) のシーンに残りますが、表示されません。動的バッチ処理レンダーパスがメッシュを収集しても、そのマテリアルのシェーダーが動的バッチ処理に対応するよう変更されていない場合も、メッシュはプレビューに表示されません。Dynamic Batching を有効にした後は、レンダーパスとマテリアルのシェーダーの両方を設定してください。
Batch Uniform Count を設定する¶
Batch Uniform Count は、動的バッチ処理レンダーパスが 1 つのバッチで処理できるオブジェクトの最大数を設定します。この値は、シェーダー内の対応するバッチ配列のサイズと一致している必要があります。
Batch Uniform Count を設定するには:
動的バッチ処理レンダーパスが使用するタグまたはオブジェクトソースにおいて、同時に表示される可能性がある静的および動的なバッチ処理対象オブジェクトの最大数を確認します。
Batch Uniform Count をその数以上に設定します。
たとえば、バッチ処理対象オブジェクトの最大数が 25 の場合は、Batch Uniform Count を
25以上に設定します。
非 UBO と UBO の動的バッチ処理のいずれにおいても、通常のバリアントと With Material バリアントは、Batch Uniform Count のデフォルト値として 25 を使用します。
ターゲットデバイスがサポートしている場合は、より大きな値を使用できます。不必要に大きな値は避けてください。一般的な目安として、100 以下の値を使用してください。
使用できる最大値は、ターゲットデバイスで利用可能なユニフォームリソースによって異なります。
注釈
Batch Uniform Count は、シェーダー内の対応するすべてのバッチ配列のサイズと一致している必要があります。
たとえば、Batch Uniform Count を 25 に設定した場合、通常の動的バッチ処理シェーダーでは次のように使用します。
uniform highp mat4 BatchWorldMatrix[25];
uniform highp mat4 BatchNormalMatrix[25];
Batch Uniform Count を 50 に変更する場合は、シェーダー内の対応する配列のサイズを 50 に変更します。
UBO 動的バッチ処理にも同じ要件が適用されます。
layout(std140, binding = 2) uniform DynamicBatchUBO
{
highp mat4 BatchNormalMatrix[25];
highp mat4 BatchWorldMatrix[25];
};
動的バッチ処理用にシェーダーを変更する¶
動的にバッチ処理されるメッシュが使用するマテリアルのシェーダーは、動的バッチ処理をサポートしている必要があります。
Dynamic Batching を有効にして動的バッチ処理レンダーパスを設定するだけでは不十分です。マテリアルのシェーダーが動的バッチ処理に対応するよう変更されていない場合、動的バッチ処理レンダーパスがメッシュを収集しても、メッシュはプレビューに表示されません。
シェーダーを変更する方法は次のいずれかです。
Kanzi Studio のシェーダー変換ツールを使用する。
シェーダーを手動で変更する。
可能な場合はシェーダー変換ツールを使用してください。ツールで対応できないシェーダー固有の要件がある場合は、シェーダーを手動で変更してください。
動的バッチ処理と互換性のないマテリアルには、動的バッチ処理用のシェーダー変更を適用しないでください。たとえば、DefaultBlit や、ブリットレンダーパス (Blit Render Pass) で使用されるその他のマテリアルは変更しないでください。
通常の動的バッチ処理用にシェーダーを手動で変更する¶
GLSL ES 3.10 を使用する¶
#version 310 es
BatchId を追加する¶
BatchId 頂点アトリビュートを追加します。
in int BatchId;
BatchId は、シェーダーがメッシュごとのデータを使用する対象となるバッチ処理されたメッシュを識別します。BatchId を使用してバッチ配列にインデックスでアクセスします。
バッチ行列を使用する¶
ワールド行列と法線行列の配列を宣言します。Batch Uniform Count が 25 の場合:
uniform highp mat4 BatchWorldMatrix[25];
uniform highp mat4 BatchNormalMatrix[25];
BatchId を使用して、現在のメッシュの行列を取得します。
mat4 WorldMatrix = BatchWorldMatrix[BatchId];
mat4 NormalMatrix = BatchNormalMatrix[BatchId];
たとえば、頂点位置を変換する場合は WorldMatrix を使用します。
gl_Position =
kzProjectionMatrix *
kzCameraMatrix *
WorldMatrix *
vec4(objPos, 1.0);
シェーダーで法線を変換する場合は、通常のオブジェクトごとの法線行列ではなく BatchNormalMatrix[BatchId] を使用します。シェーダーを編集する を参照してください。
シェーダーの完全な例¶
次の例は、通常のダイナミックバッチング用に変更したバーテックスシェーダー (Vertex Shader) とフラグメントシェーダー (Fragment Shader) の完全なコードを示しています。
バーテックスシェーダー (Vertex Shader):
#version 310 es
precision mediump float;
in vec3 kzPosition;
in vec2 kzTextureCoordinate0;
in int BatchId;
uniform highp mat4 kzProjectionCameraWorldMatrix;
uniform vec2 TextureOffset;
uniform vec2 TextureTiling;
uniform highp mat4 kzCameraMatrix;
uniform highp mat4 kzProjectionMatrix;
uniform highp mat4 BatchWorldMatrix[25];
flat out highp int vBatchID;
out vec2 vTexCoord;
void main()
{
mat4 WorldMatrix = BatchWorldMatrix[BatchId];
vBatchID = BatchId;
vTexCoord = kzTextureCoordinate0 * TextureTiling + TextureOffset;
gl_Position =
kzProjectionMatrix *
kzCameraMatrix *
WorldMatrix *
vec4(kzPosition.xyz, 1.0);
}
フラグメントシェーダー (Fragment Shader):
#version 310 es
precision mediump float;
uniform sampler2D Texture;
uniform float BlendIntensity[25];
in vec2 vTexCoord;
flat in highp int vBatchID;
out highp vec4 outColor;
void main()
{
vec4 color = texture(Texture, vTexCoord);
outColor = color * BlendIntensity[vBatchID];
}
UBO ダイナミックバッチング用にシェーダーを手動で変更する¶
UBO ダイナミックバッチングでは、通常のダイナミックバッチングと同じ BatchId によるインデックス指定の原則を使用しますが、バッチ行列は DynamicBatchUBO ユニフォームブロックに格納されます。
GLSL ES 3.10 を使用する¶
#version 310 es
BatchId を追加する¶
BatchId 頂点アトリビュートを追加します。
in int BatchId;
DynamicBatchUBO を宣言する¶
DynamicBatchUBO でバッチ行列を宣言します。
layout(std140, binding = 2) uniform DynamicBatchUBO
{
highp mat4 BatchNormalMatrix[25];
highp mat4 BatchWorldMatrix[25];
};
配列のサイズは、Dynamic Batching UBO Render Pass の Batch Uniform Count と一致する必要があります。
UBO 行列で BatchId を使用する¶
BatchId を使用して、現在のメッシュの行列を取得します。
mat4 WorldMatrix = BatchWorldMatrix[BatchId];
mat4 NormalMatrix = BatchNormalMatrix[BatchId];
フラグメントシェーダー (Fragment Shader) でバッチ ID が必要な場合は、バーテックスシェーダー (Vertex Shader) で次の出力を宣言します。
flat out highp int vBatchID;
バーテックスシェーダー (Vertex Shader) の main 関数で、次のように代入します。
vBatchID = BatchId;
シェーダーの完全な例¶
次の例は、UBO ダイナミックバッチング用に変更したバーテックスシェーダー (Vertex Shader) とフラグメントシェーダー (Fragment Shader) の完全なコードを示しています。
バーテックスシェーダー (Vertex Shader):
#version 310 es
precision mediump float;
in vec3 kzPosition;
in vec2 kzTextureCoordinate0;
in int BatchId;
uniform highp mat4 kzProjectionCameraWorldMatrix;
uniform vec2 TextureOffset;
uniform vec2 TextureTiling;
uniform highp mat4 kzCameraMatrix;
uniform highp mat4 kzProjectionMatrix;
layout(std140, binding = 2) uniform DynamicBatchUBO
{
highp mat4 BatchWorldMatrix[25];
};
flat out highp int vBatchID;
out vec2 vTexCoord;
void main()
{
mat4 WorldMatrix = BatchWorldMatrix[BatchId];
vBatchID = BatchId;
vTexCoord = kzTextureCoordinate0 * TextureTiling + TextureOffset;
gl_Position =
kzProjectionMatrix *
kzCameraMatrix *
WorldMatrix *
vec4(kzPosition.xyz, 1.0);
}
フラグメントシェーダー (Fragment Shader):
#version 310 es
precision mediump float;
uniform sampler2D Texture;
uniform float BlendIntensity;
in vec2 vTexCoord;
flat in highp int vBatchID;
out highp vec4 outColor;
layout(std140, binding = 2) uniform DynamicBatchUBO
{
highp mat4 BatchWorldMatrix[25];
};
void main()
{
vec4 color = texture(Texture, vTexCoord);
outColor = color * BlendIntensity;
}
バッチ処理されるメッシュのマテリアルプロパティを個別に制御する¶
同じバッチ内のメッシュは、同じマテリアル (Material) を使用しながら、マテリアルプロパティに異なる値を持つことができます。
たとえば、各メッシュで次の値を個別に設定する必要がある場合は、
uniform float BlendIntensity;
ユニフォームを配列に変更します。
uniform float BlendIntensity[25];
配列のサイズは Batch Uniform Count と一致する必要があります。
次の例では、通常のユニフォーム配列の構文を使用しています。UBO ダイナミックバッチングを使用する場合も、BatchId によるインデックス指定の原則は同じです。
BatchId をフラグメントシェーダーに渡す¶
フラグメントシェーダー (Fragment Shader) でメッシュごとの値が必要な場合は、バーテックスシェーダー (Vertex Shader) からフラグメントシェーダーにバッチ ID を渡します。
バーテックスシェーダー (Vertex Shader) で、次のように宣言します。
flat out highp int vBatchID;
バーテックスシェーダー (Vertex Shader) の main 関数で、次のように代入します。
vBatchID = BatchId;
フラグメントシェーダー (Fragment Shader) で、次のように宣言します。
flat in highp int vBatchID;
vBatchID を使用してメッシュごとの値をインデックス指定します。たとえば、以下の文字列を見つけます。
BlendIntensity
以下に置き換えます。
BlendIntensity[vBatchID]
例:
uniform float BlendIntensity[25];
...
float intensity = BlendIntensity[vBatchID];
整数のバッチ ID がバーテックスシェーダーとフラグメントシェーダーの間で補間されないように、flat 修飾子を使用します。
シェーダー変換ツールを使用する¶
Kanzi Studio には、Dynamic Batching が有効になっているメッシュで使用されるマテリアルを変換するシェーダー変換ツールが用意されています。これらのツールを使用すると、上記で説明した手動でのシェーダー変更のほとんどを省略できます。
ダイナミックバッチング用にマテリアルを変換するには、次の手順に従います。
メインメニューで、ダイナミックバッチングのレンダーパスに対応するツールを選択します。
Dynamic Batching Render Pass と Dynamic Batching With Material Render Pass の場合は、Tools > Dynamic Shaders を選択します。
Dynamic Batching UBO Render Pass と Dynamic Batching UBO With Material Render Pass の場合は、Tools > Dynamic UBO Shaders を選択します。
Material リストで、変換するマテリアルを選択します。
このリストには、Dynamic Batching が有効になっているメッシュで使用されるマテリアルが表示されます。
選択したマテリアルをダイナミックバッチング用にアップグレードします。
Kanzi Studio で変数選択ウィンドウが開きます。初回のアップグレードと Update Variables では、同じ変数選択レイアウトを使用します。
All Variables では、Kanzi Studio はシェーダー変数を次のグループに分類します。
Variables already present on the node: メッシュに設定されていることを Kanzi Studio が検出したマテリアルプロパティの変数。
Other Variables: ダイナミックバッチング用に選択できるその他のシェーダー変数。
All Variables で、バッチ内の各メッシュごとに個別の値を持つ必要がある変数を選択します。
Kanzi Studio は、選択した変数を Selected Variables に追加します。
このツールは、選択したメッシュごとの変数をバッチ配列に変換し、バッチ ID を使用してインデックスを付けます。
Selected Variables を確認し、OK をクリックします。
Kanzi Studio は、ダイナミックバッチング用にシェーダーを更新します。
注釈
Kanzi Studio がシェーダーの処理を完了した後、プレビューがすぐに更新されない場合があります。プレビューに以前の結果が表示されたままの場合は、プレビューを再起動してください。
バッチ変数の更新¶
ダイナミックバッチング用にマテリアルを変換すると、シェーダー変換ツールで Update Variables コマンドが使用できるようになります。
マテリアルプロパティを追加または変更する場合や、ダイナミックバッチング用に処理するシェーダー変数を変更する場合は、Update Variables を使用します。
バッチ変数を更新するには、
Tools > Dynamic Shaders または Tools > Dynamic UBO Shaders で、Material リストから変換済みのマテリアルを選択します。
Update Variables をクリックします。
Kanzi Studio は Update Batched Variables ウィンドウを開きます。このウィンドウでは、最初のマテリアルのアップグレード時と同じ変数選択レイアウトが使用されます。
All Variables で、処理する変数を選択します。
メッシュに設定されていると Kanzi Studio が検出したマテリアルプロパティの変数は、Variables already present on the node の下に表示されます。その他の変数は Other Variables の下に表示されます。
Selected Variables リストには、ダイナミックバッチング用に選択された変数が表示されます。
OK をクリックして、シェーダーを更新します。
マテリアルを元に戻す¶
変換ツールによって行われたダイナミックバッチング用のシェーダーの変更を元に戻すには、シェーダー変換ツールで変換済みのマテリアルを選択し、Revert Material をクリックします。
Batch Uniform Count の変更¶
Dynamic Shaders ツールと Dynamic UBO Shaders ツールは、サイズが 25 のバッチ配列を生成します。
Batch Uniform Count を 25 以外の値に設定する場合は、シェーダー内で生成されたバッチ配列のサイズを手動でその値に合わせて変更してください。
考慮事項¶
シェーダーの適用範囲¶
シェーダー変換および手動によるシェーダーの変更は、ダイナミックバッチングされるメッシュで使用されるマテリアルにのみ適用してください。
ブリットレンダーパス (Blit Render Pass) のレンダーパスなど、特殊なレンダリング処理に使用されるマテリアルは、ダイナミックバッチングには適していません。たとえば、DefaultBlit にはダイナミックバッチング用のシェーダーの変更を適用しないでください。
再バッチングのコスト¶
ダイナミックバッチングにより、ドローコール数と、レンダリングコマンドの送信やレンダリングステートの変更にかかる CPU コストが削減されます。一方で、ダイナミックバッチング自体も CPU 処理を発生させます。
オブジェクトが頻繁に作成または破棄され、バッチを頻繁に再構築する必要があるコンテンツには、ダイナミックバッチングが適さない場合があります。ターゲットのシーンをプロファイリングして、ダイナミックバッチングによってパフォーマンスが向上するかどうかを確認してください。