へっぽこ日記

Unity向に記事を投稿しています。たまにUIの事とかも呟くかも。

UIの最適化について色々試してみる

はじめに

この記事は Unity Advent Calender2022 の15日目の記事です

qiita.com

今回はUIの最適化について色々試してみる記事です。

今まで処理負荷を意識しないで実装していたので、そろそろ意識して実装したほうが良いと思い、色んな方法を試してみました。

以前作ったゲームのタイトルを最適化していきます

 

 

バッチング

一度の描画で複数のオブジェクトを一括で描画する仕組みをバッチングと云うみたいです。できれば一括で描画できた方が処理負荷が低いため、是非この仕組みを活かしたいです。その時に便利なのがSpriteAtlasです。

SpriteAtlas

SpriteAtlasは複数のテクスチャをまとめて、ひとつのテクスチャにするアセットなのですが、バッチングは同じテクスチャを参照しないと出来ないため、SpriteAtlasの機能を利用して実現します。

異なるテクスチャから参照されているのでバッチングできていない

以下のような感じで、複数のテクスチャをアトラス化します。単純にテクスチャをまとめただけですが、これだけで基本的な処理は終わりです。

テクスチャ同士が重なってしまうこともあるので、注意が必要だったりする

SpriteAtlasで一つのテクスチャにまとめることでバッチングができた!

一応FrameDebuggerで確認


バッチングを行う条件は他にもあるようで、「同じCanvas内にある」、「同じマテリアルを使用している」、「同じテクスチャを使用している」、「Z座標が同じ位置にある」、「同じマスクでクリップされている」といった条件があります。詳しくは、山村さんのUnityでパフォーマンスの良いUIを作る為のTipsを参照することをお勧めします。

 

Canvasを分ける

一つの要素でも変更があると、Canvas全体の描画をやり直すようです(リビルド)。そのため、基本的に動的なUIと静的なUIは、分けて別々のCanvasとして管理しておくべきようです。

今回は、フェードイン・フェードアウトのアニメーションを繰り返す画像を別のCanvasで管理するようにしました。

独立した形でCanvasを分けましたが、分けるCanvasが親子関係であっても問題は無いようです。親Canvasは、子Canvasの変更まで確認しないためです。

 

GraphicRaycasterを削除、RaycastTargetをオフにする

通常時はONになっているので、タッチやクリックを検知してくれますが、そういった動作を検知する必要が無い場合は基本不要です。

今回はボタンなどのクリックが必要なイベントがないため、OFFにしておきました。

 

おわりに

最適化前と後を比較したんですが、特に負荷自体は変化していませんでした(使用しているテクスチャとかCanvasの数が少なすぎるためですね)。他にも様々な方法があると思います。是非調べて試してみてください。

是非、読者登録をしていただくと助かります!

 

参考リンク

Unityでパフォーマンスの良いUIを作る為のTips

Unity UI の最適化に関するヒント – Unity for Pro