そろそろ気にしたほうがいいお年頃ですかね・・・
今までまったく気にしてなかったけど、UnityのUIをメインに仕事で触る身としてはそろそろ気にしたほうが良さそう
(間違っている箇所あると思います)
参考
追記:公式
いろいろ考慮する点はありそうですが、以下の内容を見ていきます。
どちらも椿さんのスライド
記事にされたもの
---
Profiler-UIについて
Profilerの下のほうにUIとUIDetailsがある。(知らなかった)
そこでいろいろ情報見れる。
ボタンを押したときとか、呼ばれる関数?が見れる
タイムラインの適当な場所をクリックすると一時停止する。
右下をComposite Overdrawにすると重なり具合が色で見える
バッチングの途切れ
テクスチャにマテリアルとポリゴンをくっつけて描画するが、これを複数やるのは無駄が多い。
なのでuGUIではCanvasにまとめて一回で描画するシステムがあります。
これがバッチングです。
これが途切れていると無駄なので、途切れさせないようにする(できるだけ多くバッチングさせる?)
バッチの数や途切れた理由を見る
プロファイラで見れる。
この場合一つのキャンバスに6つのバッチがある。別れた理由はテクスチャが違うから。
対策(SpriteAtlas)
SpriteAtlasを使う
Spriteをまとめてくれる。使ったことない。存在も知らんかった。
複数の画像を一つのテクスチャにして、一つのマテリアルに収まる
Create>SpriteAtlas
Objects for PackingでSpriteを選択。
フォルダも選択できる
PackPreviewで見れる
これだけでいいのかな?
プロファイラ見たらBatchが1個だけ減ってる・・・
何でもかんでも突っ込めばいいというわけではなく、同時に表示されるものをパックしたほうがいい。
一つのテクスチャをロードするのに、アトラスにある他のテクスチャもロードされてしまうため。
フィルレート/オーバードロー
フィルレート = 画面ピクセル数 x シェーダーの複雑さ x オーバードロー
だって
透明部分やUIが重なっている部分など無駄な部分を描画するのをオーバードローという?
確認方法はここ
Sceneの左上をOverdrawにしても似たようなものが見えた
対策(SpriteMesh)
ImageSimpleタイプの時、UseSpriteMeshを押すと
□だったSpriteがメッシュの形になる!これで透明部分は描画されない
ただしバッチングに時間がかかる。
なので、場合によってはどちらかを選択する必要があります。フィルレートを取るか、バッチングを取るか。ダウンロードサイズを取るか、CPUの処理力を取るか。そういう話ですね。
ちなみに上の表示はSceneの左上部分で変えられる。
あと中抜きのUIでSlicedしているときはFillCenterオフ
UIのリビルド(ジオメトリ)
UIが動いたり変化したり、Active切り替わった時などに再構築が走り重い
・UIのenable/disable
・マテリアルの変化
・RectTransformのサイズの変化
・Transformの親の変化
確認方法
CPUで紫の線が出ている?
CPUで下の部分をHierarchyにしてOnRectTransform~があったら
(使ってないスライダーのHandleが表示されてる・・・)
よくわからん~
対策
・動くCanvasと動かないcanvasを分ける
・ScreenSpace-Cameraでカメラを動かすと再構築が走るので、必要なければOverlayにする?
ScreenSpace-CameraやWorldSpaceでカメラを設定しないと、MainCameraをGetComponetする処理が走るらしい!最初からカメラが決まっているときは設定したほうが良さそう。
・Canvasの表示非表示
Q : Canvasの扱い
描画をしない場合はいろいろ方法がありますが、どういうのがいいの?A : GameObjectはOffにすると、その下全部がオフになり、バッファも消えるのでよくない。
CanvasのEnableとかおすすめされるが、CanvasGroupを0にしてもよい。
ただしcanvasの大きさ次第。でかいCanvasはCanvasGroupで、小さいCanvasはEnableでやった方がいいがよい。
この辺はケースバイケース、プロファイルで見ましょう。
CanvasGroupを使うとCanvas全体の透明度をいじれる
でも「UIを完全に再構築するという観点から見ると、GameObjectは効率が良い」って
どういうときだろう?
UIのリビルド(LayoutGroup)
LayoutGroupも重いらしい
必要ないなら使わない。(でも必要なんだ)
あとMechanimでUIアニメーション作るのも重い
もしやる場合は、Tweenなどの外部アセットを使ったり、SimpleAnimationみたいなステートマシンに頼らないで、変な書き込みの挙動をしない機能使う必要があります。
SimpleAnimationはUnityがGithub上で提供しているシンプルなアニメーター
スクリプトで遷移とか゚を管理するっぽい。知らなかった~
その他
不要なRaycastTargetをオフ
PixelPerfectも
使ったことないけど、鮮明に描画してくれるらしい
Canvas-pixelPerfect - Unity スクリプトリファレンス
・テクスチャ小さく
・TextのOutlineはポリゴンが増える。TextMeshProがきれいで軽い
・AssetBundleに格納するときはSpriteDefaultマテリアルを使わない
テクスチャ設定
2のべき乗
2のべき乗のピクセル数にするとメモリ負荷を抑えられる.
2,4,8,16,32,64,128,256,512,1024 ,2048,4096・・・
2のべき乗じゃない場合NPOTって表示される
縦と横、両方とも2のべき乗じゃないと効果ないのかな?
こちらの記事とても勉強になる
Read/Wright
必要ないならオフにする
MipMap
テクスチャのサイズを小さくするには圧縮テクスチャを使用します。 これにより、読み込み時間を短縮し、メモリフットプリントを縮小し、レンダリングパフォーマンスを大幅に向上できます。圧縮テクスチャは、圧縮されていない 32 ビット RGBA テクスチャに必要なメモリ帯域幅のわずかな部分しか使用しません。
ミップマップテクスチャ
3D シーンで使用されるテクスチャでは、常に Generate Mip Maps を有効にしてください。ミップマップテクスチャは GPU を有効にし、小さな三角形では低解像度を使用します。圧縮テクスチャにより GPU がレンダリングの際に転送されるテクスチャデータの量が制限されるのと同様です。
3Dで使うテクスチャはMipMapをOnにせよと書いてあった
MipMapは、カメラから離れたときにボヤーってしたテクスチャに変化させて描画負荷を下げるやつ
Advancedを開くと設定がある。
デフォルトではoffになってる(たぶん)
下のプレビューのスライダーで確認できる
MipMapはメモリを消費するが描画には良い
どうやって効果を確かめるのかよくわからなかったけど、Spriteをシーンで小さくして、GameViewで拡大してみたら違った。
左がMitMapあり、右がなし
カメラからの距離が変わらないUIのテクスチャなら使う必要はない。
最後に
UIを動かさないようにするというのが大事
VRで空間にメニューとか゚出すときは、体追従じゃなくて空間固定のほうが負荷少ないのかな?
今やっているプロジェクトのプロファイラー見たら、体に追従するメニューを表示したときぶわ!!ってグラフが動いた。
何も操作してないのにずっとスクロールビューがプロファイラーに表示される・・・
Unityデザイナーズバイブルでも、Maskはコストが高いからMask2Dを使ったほうがいい・テクスチャサイズは2のべき乗・FillCenterの話などパフォーマンスの話が合った。