はじめに
この記事は Unity Advent Calender2022 の15日目の記事です
今回はUIの最適化について色々試してみる記事です。
今まで処理負荷を意識しないで実装していたので、そろそろ意識して実装したほうが良いと思い、色んな方法を試してみました。
バッチング
一度の描画で複数のオブジェクトを一括で描画する仕組みをバッチングと云うみたいです。できれば一括で描画できた方が処理負荷が低いため、是非この仕組みを活かしたいです。その時に便利なのがSpriteAtlasです。
SpriteAtlas
SpriteAtlasは複数のテクスチャをまとめて、ひとつのテクスチャにするアセットなのですが、バッチングは同じテクスチャを参照しないと出来ないため、SpriteAtlasの機能を利用して実現します。
以下のような感じで、複数のテクスチャをアトラス化します。単純にテクスチャをまとめただけですが、これだけで基本的な処理は終わりです。
バッチングを行う条件は他にもあるようで、「同じCanvas内にある」、「同じマテリアルを使用している」、「同じテクスチャを使用している」、「Z座標が同じ位置にある」、「同じマスクでクリップされている」といった条件があります。詳しくは、山村さんの
Canvasを分ける
一つの要素でも変更があると、Canvas全体の描画をやり直すようです(リビルド)。そのため、基本的に動的なUIと静的なUIは、分けて別々のCanvasとして管理しておくべきようです。
今回は、フェードイン・フェードアウトのアニメーションを繰り返す画像を別のCanvasで管理するようにしました。
独立した形でCanvasを分けましたが、分けるCanvasが親子関係であっても問題は無いようです。親Canvasは、子Canvasの変更まで確認しないためです。
GraphicRaycasterを削除、RaycastTargetをオフにする
通常時はONになっているので、タッチやクリックを検知してくれますが、そういった動作を検知する必要が無い場合は基本不要です。
今回はボタンなどのクリックが必要なイベントがないため、OFFにしておきました。
おわりに
最適化前と後を比較したんですが、特に負荷自体は変化していませんでした(使用しているテクスチャとかCanvasの数が少なすぎるためですね)。他にも様々な方法があると思います。是非調べて試してみてください。
是非、読者登録をしていただくと助かります!