【Unity】動的バッチングの恩恵を受けようの会
SetPass call
SetPass callはメッシュの描画に
使用する設定(render state)をGPUに渡す命令呼び出しのこと。
これから描画するメッシュの設定が、
前に描画したメッシュの設定と異なる場合にのみ呼び出される。
Draw call
DirectXやOpenGL等のグラフィックスAPIを用いて
CPUからGPUへオブジェクトの描画命令を出すこと。
最新のSetPass callによる設定を使用して描画を行う。
CPUは、GPUのAPI呼び出しに必要な
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