🧲

Unity の Batch Breaking Reason

3 min read

Batch Breaking Reason とは

Unity の Profiler や Frame Debugger ではレンダリングのバッチが中断した理由(Batch Breaking Reason)を見ることができる。バッチの総数を減らすことで描画のパフォーマンスを改善できるので、できるだけバッチが中断されないようにしたい。

バッチ中断のサンプル

バッチ中断の理由の一覧およびバッチ中断を発生させるサンプルプロジェクトが GitHub で公開されている。

https://github.com/Unity-Technologies/BatchBreakingCause

サンプルプロジェクトを実行して、Frame Debugger の "Why this draw call can't be batched with the previous one(なぜこのドローコールが直前のものとバッチできないのか)" の項を見れば、このメッシュが直前のバッチに含めることができなかった理由の詳細がわかる。

バッチ中断理由の解説

  • Additional Vertex Streams - MeshRenderer.additionalVertexStreams でオブジェクトに頂点ストリームを追加したため。
  • Deferred Objects on Different Lighting Layers -(Deferred Rendering を使っていて)GameObject の Layer が直前のバッチとは異なるため。
  • Deferred Objects Split by Shadow Distance -(Deferred Rendering を使っていて)Shadow のカスケードが直前のバッチとは異なるため。
  • Different Combined Meshes -(StaticBatchingUtility.Combine や自動の静的バッチングで)結合されたメッシュが直前のバッチとは異なるため。
  • Different Custom Properties - 直前のバッチのものとは異なる Material Property Block の Property が存在するため。
  • Different Lights - Light が直前のバッチとは異なるため。
  • Different Materials - Material が直前のバッチとは異なるため。
  • Different Reflection Probes - Reflection Probes が直前のバッチとは異なるため。
  • Different Shadow Caster Hash - Shadow Casting のシェーダーが直前のバッチとは異なる。あるいは、Shadow Caster パスに影響を与えるシェーダープロパティ/キーワードに直前のバッチとは異なる値が設定されているため。
  • Different Shadow Receiving Settings - MeshRenderer の Lighting の Receive Shadows の設定が直前のバッチとは異なるため。
  • Different Static Batching Flags - GameObject の Static フラグが異なる(Batching Static か否か)ため。
  • Dynamic Batching Disabled to Avoid Z-Fighting - Player Settings で動的バッチングが無効にされている。あるいは Z ファイティングを避けるために一時的に動的バッチングが無効にされたため。
  • Instancing Different Geometries - 直前のバッチとは異なる GPU インスタンシングのメッシュ/サブメッシュをレンダリングしようとしたため。
  • Lightmapped Objects - オブジェクトに直前のものとは異なるライトマップが使われている。あるいは、同じライトマップだが異なるライトマップ UV トランスフォーメーションが使われているため。
  • Lightprobe Affected Objects - 直前のバッチとは異なる Lightprobe の影響を受けているため。
  • Mixed Sided Mode Shadow Casters - Cast Shadows の設定が直前のバッチとは異なるため。
  • Multipass - マルチパスのシェーダーを使用しているため。
  • Multiple Forward Lights - Forward Rendering を使っていて、複数の Light が使われているため。
  • Non-instanceable Property Set -(GPU インスタンシングを行っていて)インスタンス化されていないプロパティ値が直前のバッチとは異なっているため。
  • Odd Negative Scaling - 直前のバッチのメッシュと Negative Scaling(Trasnform の Scale の x, y, z の要素のうち負の要素の数の偶奇)が異なるため。たとえば、Scale が (1, 1, 1) のメッシュと (-1, 1, 1) のメッシュは別のバッチになる。
  • Shader Disables Batching - シェーダーの Tags に "DisableBatching"="True" が設定されているため。
  • Too Many Indices in Dynamic Batch - 動的バッチングでの Index が多すぎるため(32768 個超)。
  • Too Many Indices in Static Batch - 静的バッチングでの Index が多すぎるため(MacOSX では 32768 個超、OpenGLES では 49152 超、それ以外では 65536 個超)。
  • Too Many Vertex Attributes for Dynamic Batching - 動的バッチングで頂点アトリビュートが多すぎる(900 個超)ため。
  • Too Many Vertices for Dynamic Batching - 動的バッチングで頂点が多すぎる(300 頂点超)。

参考リンク