【Unity】動的バッチングの恩恵を受けようの会

SetPass call

SetPass callはメッシュの描画に
使用する設定(render state)をGPUに渡す命令呼び出しのこと。
これから描画するメッシュの設定が、
前に描画したメッシュの設定と異なる場合にのみ呼び出される。

Draw call

DirectXOpenGL等のグラフィックスAPIを用いて
CPUからGPUへオブジェクトの描画命令を出すこと。
最新のSetPass callによる設定を使用して描画を行う。

CPUは、GPUAPI呼び出しに必要な
meshやtexture、shaderなどの情報を用意する必要があり、負荷が高い。
ドローコールはCPU側の負荷のため、回数が多いとフレームレートが下がる可能性がある。

動的バッチング(Dynamic Batching)

CPUが条件に合うMeshをまとめてから
ドローコールを行いドローコールの回数を減らすための機能。

動的バッチングもCPU負荷なので、
ドローコールの負荷 < 動的バッチングの負荷だと逆効果になってしまう。

動的バッチングの機能を有効にするには
Player Settings の Dynamic Batching にチェック を入れる

動的バッチングの恩恵を受けるための条件

同じMaterialを共有している(同じShaderではない)

テクスチャだけが異なる二つのMaterialであれば、
テクスチャをアトラス化し、同じMaterialを使用するようにすれば条件をクリアできる

スクリプトでMaterialにアクセスする場合、
Renderer.materialを使用すると複製された別インスタンスのMaterialが返されてしまい
バッチングが効かなくなるのでRenderer.sharedMaterialを使用する。

頂点属性が900以下で頂点数が300以下である必要がある

頂点属性とは各頂点が持てる以下のようなデータのこと。

・法線(normal)  
・接線(tangent)  
・最大8つのテクスチャ座標(UV)  
・頂点カラー(color)  
・ボーンウェイトとブレンドインデックス

Shaderが座標、法線、UV0 の計3つの頂点属性を使用する場合は、
頂点数 300 までであればバッチ処理が有効になる。
また、座標、法線、UV0、UV1、接線 の計5つの使用する場合は、
5*180で頂点属性が900になるので 頂点数 180 までになる。

Transformにミラーを含まない

二つのGameObject間で同じMaterialを共有していも
片方のGameObjectのScaleが(x=1, Y=-1, z=1)のように
負数が設定されているとバッチングされない

ちなみに、(x=1, Y=-1, z=-1)のように具数個の負数だと、
反転の反転で元に戻るためバッチングが効く

マルチパスシェーダではない

マルチパスシェーダはShaderファイル内に Pass セクションが複数記述されているShaderのこと。

バッチ処理対応のRenderer

MeshRenderer, TrailRenderer, LineRenderer, ParticleSystem, SpriteRendererのみがバッチング可能。
SkinnedMeshRenderer や ClothRenderer やその他Rendererはバッチングに対応していない。

参考

docs.unity3d.com docs.unity3d.com learn.unity.com →A brief introduction to rendering の辺り esprog.hatenablog.com