トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

UIパフォーマンスのお勉強

そろそろ気にしたほうがいいお年頃ですかね・・・

今までまったく気にしてなかったけど、UnityのUIをメインに仕事で触る身としてはそろそろ気にしたほうが良さそう

(間違っている箇所あると思います)

参考

追記:公式

docs.unity3d.com

いろいろ考慮する点はありそうですが、以下の内容を見ていきます。

どちらも椿さんのスライド

www.slideshare.net

記事にされたもの

raspberly.hateblo.jp

logmi.jp

---

docs.google.com

raspberly.hateblo.jp

Profiler-UIについて

Profilerの下のほうにUIとUIDetailsがある。(知らなかった)

そこでいろいろ情報見れる。

docs.unity3d.com

f:id:bibinbaleo:20200817161304p:plain

ボタンを押したときとか、呼ばれる関数?が見れる

f:id:bibinbaleo:20200817161300p:plain

タイムラインの適当な場所をクリックすると一時停止する。

f:id:bibinbaleo:20200818092945p:plain
右下をComposite Overdrawにすると重なり具合が色で見える

f:id:bibinbaleo:20200818093020p:plain

バッチングの途切れ

テクスチャにマテリアルとポリゴンをくっつけて描画するが、これを複数やるのは無駄が多い。
なのでuGUIではCanvasにまとめて一回で描画するシステムがあります。
これがバッチングです。

これが途切れていると無駄なので、途切れさせないようにする(できるだけ多くバッチングさせる?)

バッチの数や途切れた理由を見る

プロファイラで見れる。

f:id:bibinbaleo:20200817172951p:plain

この場合一つのキャンバスに6つのバッチがある。別れた理由はテクスチャが違うから。

対策(SpriteAtlas)

SpriteAtlasを使う

docs.unity3d.com

Spriteをまとめてくれる。使ったことない。存在も知らんかった。

複数の画像を一つのテクスチャにして、一つのマテリアルに収まる

kan-kikuchi.hatenablog.com

Create>SpriteAtlas

f:id:bibinbaleo:20200818093828p:plain

Objects for PackingでSpriteを選択。

f:id:bibinbaleo:20200818093754p:plain

フォルダも選択できる

f:id:bibinbaleo:20200818093712p:plain

PackPreviewで見れる

f:id:bibinbaleo:20200818094100p:plain

これだけでいいのかな?

プロファイラ見たらBatchが1個だけ減ってる・・・

f:id:bibinbaleo:20200818094253p:plain

何でもかんでも突っ込めばいいというわけではなく、同時に表示されるものをパックしたほうがいい。

一つのテクスチャをロードするのに、アトラスにある他のテクスチャもロードされてしまうため。

フィルレート/オーバードロー

フィルレート = 画面ピクセル数 x シェーダーの複雑さ x オーバードロー

最適化 - Unity マニュアル

 だって

透明部分やUIが重なっている部分など無駄な部分を描画するのをオーバードローという?

確認方法はここ

f:id:bibinbaleo:20200818093020p:plain

Sceneの左上をOverdrawにしても似たようなものが見えた

f:id:bibinbaleo:20200818095801p:plain

対策(SpriteMesh)

ImageSimpleタイプの時、UseSpriteMeshを押すと

f:id:bibinbaleo:20200818095514p:plain

□だったSpriteがメッシュの形になる!これで透明部分は描画されない

f:id:bibinbaleo:20200818095523p:plainf:id:bibinbaleo:20200818095535p:plain

ただしバッチングに時間がかかる。

なので、場合によってはどちらかを選択する必要があります。フィルレートを取るか、バッチングを取るか。ダウンロードサイズを取るか、CPUの処理力を取るか。そういう話ですね。

Unityでパフォーマンスの良いUIを作るためのTips UIのリビルドとの上手な付き合い方 - ログミーTech

ちなみに上の表示はSceneの左上部分で変えられる。

f:id:bibinbaleo:20200818095425p:plain

 

あと中抜きのUIでSlicedしているときはFillCenterオフ

f:id:bibinbaleo:20200814143149p:plain

f:id:bibinbaleo:20200814143146p:plain

 

UIのリビルド(ジオメトリ)

UIが動いたり変化したり、Active切り替わった時などに再構築が走り重い

・UIのenable/disable
・マテリアルの変化
・RectTransformのサイズの変化
・Transformの親の変化

確認方法

CPUで紫の線が出ている?

f:id:bibinbaleo:20200818114040p:plain

CPUで下の部分をHierarchyにしてOnRectTransform~があったら

f:id:bibinbaleo:20200818114008p:plain

(使ってないスライダーのHandleが表示されてる・・・)

よくわからん~

対策

・動くCanvasと動かないcanvasを分ける

・ScreenSpace-Cameraでカメラを動かすと再構築が走るので、必要なければOverlayにする?

f:id:bibinbaleo:20200818102130p:plain

ScreenSpace-CameraやWorldSpaceでカメラを設定しないと、MainCameraをGetComponetする処理が走るらしい!最初からカメラが決まっているときは設定したほうが良さそう。

・Canvasの表示非表示

Q : Canvasの扱い
描画をしない場合はいろいろ方法がありますが、どういうのがいいの?

A : GameObjectはOffにすると、その下全部がオフになり、バッファも消えるのでよくない。
CanvasのEnableとかおすすめされるが、CanvasGroupを0にしてもよい。
ただしcanvasの大きさ次第。

でかいCanvasはCanvasGroupで、小さいCanvasはEnableでやった方がいいがよい。
この辺はケースバイケース、プロファイルで見ましょう。

勉強会レポ : Unityでパフォーマンスの良いUIを作る為のTips - Raspberlyのブログ

 CanvasGroupを使うとCanvas全体の透明度をいじれる

f:id:bibinbaleo:20200817172051p:plain

Canvas Group - Unity マニュアル

でも「UIを完全に再構築するという観点から見ると、GameObjectは効率が良い」って

どういうときだろう?

UIのリビルド(LayoutGroup)

LayoutGroupも重いらしい

必要ないなら使わない。(でも必要なんだ)

f:id:bibinbaleo:20200818132256p:plain

UnityのUIでやってはいけないこと - Google スライド

 

あとMechanimでUIアニメーション作るのも重い

もしやる場合は、Tweenなどの外部アセットを使ったり、SimpleAnimationみたいなステートマシンに頼らないで、変な書き込みの挙動をしない機能使う必要があります。

 

 

SimpleAnimationはUnityがGithub上で提供しているシンプルなアニメーター

qiita.com

スクリプトで遷移とか゚を管理するっぽい。知らなかった~

その他

不要なRaycastTargetをオフ

f:id:bibinbaleo:20200818130519p:plain

PixelPerfectも

f:id:bibinbaleo:20200818130703p:plain

使ったことないけど、鮮明に描画してくれるらしい

Canvas-pixelPerfect - Unity スクリプトリファレンス

 

・テクスチャ小さく

・TextのOutlineはポリゴンが増える。TextMeshProがきれいで軽い

・AssetBundleに格納するときはSpriteDefaultマテリアルを使わない

f:id:bibinbaleo:20200818135110p:plain

テクスチャ設定

2のべき乗

2のべき乗のピクセル数にするとメモリ負荷を抑えられる.

2,4,8,16,32,64,128,256,512,1024 ,2048,4096・・・

2のべき乗じゃない場合NPOTって表示される

f:id:bibinbaleo:20200814130018p:plain

縦と横、両方とも2のべき乗じゃないと効果ないのかな?

f:id:bibinbaleo:20200814141656p:plain

f:id:bibinbaleo:20200814141826p:plain

light11.hatenadiary.com

こちらの記事とても勉強になる

note.com

Read/Wright

必要ないならオフにする

MipMap

テクスチャのサイズを小さくするには圧縮テクスチャを使用します。 これにより、読み込み時間を短縮し、メモリフットプリントを縮小し、レンダリングパフォーマンスを大幅に向上できます。圧縮テクスチャは、圧縮されていない 32 ビット RGBA テクスチャに必要なメモリ帯域幅のわずかな部分しか使用しません。

ミップマップテクスチャ
3D シーンで使用されるテクスチャでは、常に Generate Mip Maps を有効にしてください。ミップマップテクスチャは GPU を有効にし、小さな三角形では低解像度を使用します。圧縮テクスチャにより GPU がレンダリングの際に転送されるテクスチャデータの量が制限されるのと同様です。

グラフィックスパフォーマンスの最適化 - Unity マニュアル

 3Dで使うテクスチャはMipMapをOnにせよと書いてあった

MipMapは、カメラから離れたときにボヤーってしたテクスチャに変化させて描画負荷を下げるやつ

Advancedを開くと設定がある。

f:id:bibinbaleo:20200917100538p:plain

デフォルトではoffになってる(たぶん)

下のプレビューのスライダーで確認できる

f:id:bibinbaleo:20200917101037g:plain

MipMapはメモリを消費するが描画には良い

どうやって効果を確かめるのかよくわからなかったけど、Spriteをシーンで小さくして、GameViewで拡大してみたら違った。

左がMitMapあり、右がなし

f:id:bibinbaleo:20200917101426p:plainf:id:bibinbaleo:20200917101428p:plain

カメラからの距離が変わらないUIのテクスチャなら使う必要はない。

doruby.jp

docs.unity3d.com

最後に

UIを動かさないようにするというのが大事

VRで空間にメニューとか゚出すときは、体追従じゃなくて空間固定のほうが負荷少ないのかな?

今やっているプロジェクトのプロファイラー見たら、体に追従するメニューを表示したときぶわ!!ってグラフが動いた。

何も操作してないのにずっとスクロールビューがプロファイラーに表示される・・・

 

Unityデザイナーズバイブルでも、Maskはコストが高いからMask2Dを使ったほうがいい・テクスチャサイズは2のべき乗・FillCenterの話などパフォーマンスの話が合った。

bibinbaleo.hatenablog.com