uGUIのバッチング挙動調べる。
環境
Mac,Unity2018.3.11f1, Pro,
素材
バッチングとは
GPUに描画命令を出す際に各UIをまとめて一斉に行う処理のこと。
uGUIのバッチング処理は割と優秀らしい。
バッチを見る
適当にUIを組む
バッチ数確認
ゲーム起動後、ProfilerのUI欄を見る。
バッチ数11。

バッチの内訳を見る
バッチ数11の内訳はフレームデバッカーの方が見やすいのでフレームデバッカーを使う。
- ダイアログの背景画像を描画
 - ダイア6個描画(同じTextureのため)
 - アイコン1つ描画
 - ボタンの背景描画
 - アイコン2つ描画
6 ~ 8. 残り描画 
5でアイコンが2つ描画されるのすごい。同じテクスチャを使っている&他のテクスチャを使ったUIとの入れ子になってなければバッチングが行われる。この条件を満たすために5のアイコンを最初の方に描画している。
SpriteAtlasを使う
SpriteAtlasを作成し、画像フォルダを指定した。
UI描画時に他の画像映り込まないようにAllow RotationとTight Packingのチェックを外した。

SpriteAtlas後のバッチ
非アクティブなGameObject
非アクティブなGameObjectがあるとバッチ数はどうなるのか。Windowの背景とダイア以外を非アクティブにした。
非アクティブだと描画されない。なのでButtonのTextは描画されず、バッチ数1になった。

動くとどうなるのか
バッチ数は2のまま。動いていてもバッチされる。(Layoutの再計算は走っているはず)

テキストの上にUIを置くと
テキストの上に星を置いた。バッチ数は3になった。他のテクスチャが間に入ってしまうとバッチングされないため。

CanvasGroupをつけると
星にCanvasGroupコンポーネントをつけた。バッチ数は2。このコンポーネントの有無でバッチ数は変わらない。

Canvasをつけると
星にCanvasコンポーネントをつけた。バッチ数は3に。このコンポーネントをつけるとOverride Sortingしてなくてもバッチングされない。

参考文献
https://docs.unity3d.com/ja/2018.1/Manual/DrawCallBatching.html
https://www.slideshare.net/UnityTechnologiesJapan/unityuitips




