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