UnityのURPの機能でSRP Bacher、 Dynamic Batching などまとめてみました。
- GPU Instancing
- SRP Bacher
- Dynamic Baching
- Static Baching
GPU Instancing
https://docs.unity3d.com/ja/Manual/GPUInstancing.html
・同じマテリアル且同じメッシュのオブジェクトをまとめて描画する機能
・使用するにはマテリアルにEnable GPU Instancingを設定
・そのシェーダーのシェーダーバリアント数が倍増する
・違うメッシュに適用できない
・Skinned Meshは使えない
・Billboardのパーティクルは使えない。メッシュパーティクルは使える。ParticleSystemにEnable GPU Instancingを設定する必要があります。
説明:https://docs.unity3d.com/Manual/PartSysInstancing.html
SPR Batcher
https://docs.unity3d.com/Manual/SRPBatcher.html
日本語:https://blogs.unity3d.com/jp/2019/02/28/srp-batcher-speed-up-your-rendering/
・同じシェーダーバリアントのマテリアルの違うメッシュてもまとめて描画する機能
・使用するにはURP設定ファイルのSPR Batcherをチェックすること
・シェーダーはSPR Batcherに対応しないと使えません。
(シェーダーはSPR Batcherのcompatibleやnot compatibleを表示する)
・シェーダーのシェーダーバリアント数が多いと効きにくいです。
・違うメッシュに適用できます。
・Skinned Meshは使える(Unity 2019.3.0 Alpha 5から)
・メッシュやBillboardのパーティクルは使えません。
Dynamic Batching
https://docs.unity3d.com/ja/Manual/DrawCallBatching.html
・同じマテリアルのProperty入力一致の小さいメッシュのオブジェクトをまとめて描画する機能
・使用するにはURP設定ファイルのDynamic Batchingをチェックしましょう。
・CPU 上でゲームオブジェクトのすべての頂点をワールド空間に変換することによって機能するので、このCPU処理がドローコールより重い場合使う利点がありません。
・ライトマップ付きオブジェクト 、マルチパスのシェーダーは使えない。プラスとマイナススケールのオブジェクトは一緒にバッチ処理できません。
・メッシュとBillboardのパーティクルは使えます。
Static Batching
https://docs.unity3d.com/ja/Manual/DrawCallBatching.html
・右上のStaticのBatching Staticを設定した同じマテリアルのメッシュに適用できます
・ドローコールは減らせるが、メモリ消費量が増える
・ビルドの時点でゲームオブジェクトのすべての頂点をワールド空間に変換するとによって機能するので、アプリのサイズが増える
・大量な同じメッシュのバッチングには向かない、バッチングできたメッシュを全オブジェクトに適用するからメモリ消費が増える
・シェーダーバリアントの判別はマテリアルのキーワードリストで判別している為
同じ設定のマテリアルがあっても、別シェーダーのキーワードが残ると違うシェーダーバリアントと判別されてバッチ処理が分かれることになります。
・バッチ処理できるマテリアルを一気に処理することではなく、決まった順番バッチ処理していくので違うシェーダーバリアントのマテリアルが混ざるとバッチ処理が分断されます。
・影のレンダー処理もバッチ処理できるが、こちらは同じシェーダーバリアントでもバッチ処理しないことがあります。
幸い影はレンダーで生成しないように設定できるので、影響の少ない影を生成しないようにすれば軽くなる(キャラの顔、壁についてるもの、小物など)
・MeshRendererとSkinnedMeshRendererは同じマテリアルでも一緒にバッチ処理できない
・シェーダーがSRP Batcherサポートしても SpriteRendererには効かないようです。