うにてぃブログ

UnityやUnreal Engineの記事を書いていきます

【Unity】uGUI Text のバッチング

uGUI では Hierarchy の上にあるものから順番に描画される

この際に同じ Atlas の場合 バッチングされる
そのため間に Text をはさんだ場合バッチングが途切れると思っていたが
特定のケースでバッチングされることがあったのでそれについてまとめる

※Unity2019.4.0f1 で検証

現象

f:id:hacchi_man:20200624210814p:plain:w200

の状態場合 Image の間に Text が挟まれているため バッチングされず
6回 Draw が走るものだと考えていましたが Frame Debugger で確認したところ 2回 Draw で描画されていました

f:id:hacchi_man:20200624211412p:plain:w250f:id:hacchi_man:20200624211424p:plain:w250

調査

Atlas が同一でない画像を途中に追加

New の位置に 追加した

f:id:hacchi_man:20200624213429p:plain:w200

3 Draw になったが追加した画像が最後に描画された

f:id:hacchi_man:20200624213603p:plain:w250f:id:hacchi_man:20200624213616p:plain:w250f:id:hacchi_man:20200624213625p:plain:w250

Atlas が同一な画像を途中に追加

New の位置に 追加した

f:id:hacchi_man:20200624213429p:plain:w200

最初と変わらず 2 Draw

f:id:hacchi_man:20200624214420p:plain:w250f:id:hacchi_man:20200624214434p:plain:w250

Atlas が同一ではない画像を最初に追加

4 Draw

f:id:hacchi_man:20200624221935p:plain:w300f:id:hacchi_man:20200624221948p:plain:w300f:id:hacchi_man:20200624222000p:plain:w300f:id:hacchi_man:20200624222013p:plain:w300

Atlas が同一ではない画像を最初に追加 し 次に Atlasが同一な画像を追加

3 Draw

f:id:hacchi_man:20200624222237p:plain:w250f:id:hacchi_man:20200624222245p:plain:w250f:id:hacchi_man:20200624222220p:plain:w250

Atlas が同一ではない画像を途中に追加

間に追加した場合、追加した画像が最後に描画されその次に画像下のテキストが描画されました

4 Draw

f:id:hacchi_man:20200624234947p:plain:w300f:id:hacchi_man:20200624235007p:plain:w300f:id:hacchi_man:20200624235016p:plain:w300f:id:hacchi_man:20200624235025p:plain:w300

Text の一部が Imageによって隠されている場合

テキストの一部が隠されている場合はバッチングが効かず 4 Draw でした

f:id:hacchi_man:20200624222837p:plain:w300f:id:hacchi_man:20200624222847p:plain:w300f:id:hacchi_man:20200624222855p:plain:w300f:id:hacchi_man:20200624222904p:plain:w300

TextMeshPro を間に挟んだ場合

f:id:hacchi_man:20200624223330p:plain

TextMeshPro と Textを交互に挟んだ場合でも どちらも最後にまとめて描画されていた

3 Draw

f:id:hacchi_man:20200624223231p:plain:w250f:id:hacchi_man:20200624223244p:plain:w250f:id:hacchi_man:20200624223255p:plain:w250

推測

Text から見て 同じAtlas参照の場合がまとめてバッチングされていると考えられる

つまり、

SprietA
└ Text1
     ├ SprietB
      │ └ Text2
     ├ SprietA
        └ Text3

の場合 Text1 と Text3 の参照画像構成が同一なので バッチングされる

SprietA
└ Text1
     ├ SprietB
      │ └ SprietA
      │     └ Text2
     └ SprietB
        └ SprietA
            └ Text3

の場合 Text2 と Text3 の参照画像構成が同一なので バッチングされる

このバッチングについて調査してみたが、検索力が足りず成果は得られなかった