VRのUnityプロジェクトが激重になったので、どうにかしたい。
プロファイラは見た。
次はパフォーマンス改善。最適化ともいうのかな?
いろいろツールやアプローチ方法はありそう。
初心者なので間違ってるところも多いと思います
- 参考
- uGUIとかテクスチャ
- Statics
- 頂点数を落とす
- Lighting
- オクルージョンカリング
- MeshBake
- LOD
- スクリプト
- Camera
- 物理
- 動画
- シェーダー
- Quality設定
- Oculus設定
- Sceneビュー非表示
- その他設定
- オーディオファイル
- Mesh
参考
公式
- PC 向けでは頂点数 20 万未満、フレーム毎では 300 万より少なくなるようにします(ターゲットとする GPU のスペックに依存します)。
- ビルトインシェーダーを使用する場合、 Mobile または Unlit のカテゴリーから選択する。モバイルでないプラットフォームでも動作しますが、より複雑なシェーダーの簡素化され、近似化されたバージョンです。
- シーンにおける異なるマテリアルの数を低く抑えます - 異なるオブジェクト間でマテリアルをできるかぎり共有します。
- 動かないオブジェクトに対して、
Static
を設定して、ドローコールバッチング のような内部の最適化を許容します。 - ジオメトリに影響する
ピクセルライト
(完璧にディレクショナルな) を複数でなく、 1つだけ設定するようにします。 - 動的なライティングを使用するより、ライティングをベイクするようにします。
- 圧縮テクスチャ形式を可能な場合は使用する、その他の場合は 32 ビットよりも 16 ビットを選択します。
- 可能な限りフォグの使用を避けます。
- 遮蔽物が沢山ある複雑で静的なシーンの場合には、オクルージョンカリング を使用して表示するジオメトリの量とドローコールを削減します。オクルージョンカリングを念頭に置きながら、レベルの設計をします。
- Skybox を使用して遠くのジオメトリを “本物に見せかけます”。
- ピクセルシェーダーを使用するか、Texture Combiner を使用して、マルチパスではなく複数のテクスチャをミックスします。
- 可能な場合は、
半
精度浮動小数点数の変数を使用してください。 pow
、sin
、cos
などの複雑な数値計算の使用を最小限に抑えます。
フラグメントごとのテクスチャを極力使用しないようにします。
この記事もめっちゃ神だった
uGUIとかテクスチャ
uGUIとかテクスチャ周りは以前調べた。
bibinbaleo.hatenablog.com テクスチャやuGUI周りってどれぐらい影響出るんだろう?
まずは3Dのレンダリング周りをやったほうが結果出るかな。まあプロファイリングの結果次第か・・・
Statics
動かないものはStaticsにすると良い場合もある
静的バッチ処理はCPU上で頂点の変換を行わないため動的バッチ処理よりもCPUは低負荷だが、メモリを多く消費する。
必ずしもいいわけではないのか
頂点数を落とす
最適化講座では、あまりここが問題になることはないって言ってた。
頂点数
モバイルで 10万以下、PC で数百万以下
~~
PC 向けでは頂点数 20 万未満、フレーム毎では 300 万より少なくなるようにします
OVRProfileには10万以下がイイって書いてた
Lighting
ベイクするなど
DirectionalLight1つしか使ってないプロジェクトでも考慮すべきことあるかな?
影とか??
オクルージョンカリング
カメラに写っていないオブジェクトは表示しないようにする処理
別記事で試した。
MeshBake
同じマテリアルのメッシュを一つに合体させるアセット
MeshBaker
Mesh Combine Studio
無料アセットをこの記事で試した。Batchesが減る
LOD
遠くにいるときはローポリのオブジェクトに変化させるやつ。
でもローポリのオブジェクトを用意しないといけない。
スクリプト
debug.Log
debug.Logは重いって。でもビルドしたものには関係ない?
Editorで実行するときにかかわる。
製品化したときもログの文章自体は出る
PlayerSettingのLogをNonにしたらStackTraceはなくなるらしい
でもDebug文自体は出る。
文章を出さないようにするには
Debug.unityLogger.logEnabled = false;
をStartなどに書いたら出なくなった。
文字列操作
文字の足し算などの文字列操作はメモリを使用する。GarbageCollection(GC)が起きる。
StringBuilderを使う
float,half
floatの代わりにhalfという中精度の浮動小数点値を使うとモバイルGPUではパフォーマンスに影響することもあるらしい。
浮動小数点数の変数の精度 ( float 対 half 対 fixed ) が、 デスクトップ GPU ではほとんど無視される一方で、 モバイル GPU でよいパフォーマンスを得ることがかなり重要になっています。
~~
可能な場合は、 半 精度浮動小数点数の変数を使用してください。
詳しいこと
キャッシュ
Update中にgetComponentやFindせずに、なるべくStart()など最初にまとめて探しておく
Camera
CameraのClippingPlanesで無駄に遠くを描画しない。どれくらい効果があるのかは知らない。
RenderTexture?
CameraとRenderTextureで鏡的なことをやっているけど、そのCamera単体でBatches的が600~800あった。カメラ消したらBatcheの数が減る。
RenderTextureの解像度はかなり下げてるしこれ以上どうしたらいいんだろう・・・
なんかカメラの設定とかあるかな?
物理
MeshColliderでなくBoxColliderを使う
判定回数はProjectSettings>TimeでFixedTimestepで変更できる。30fpsなら0.033でいい
この話もこの記事に書いてあった
動画
動画再生は重いらしい
シェーダー
地面や空など描画面積が多い場所のシェーダーが重いと描画負荷がやばい
Quality設定
UltraからVeryHighにした
Qualityの設定はこちらの記事に書いてあるのを参考にして、個別に変えた
Oculus設定
GPUの使用率が高くなるとフレーム落ちしないように自動的に解像度を下げるAdaptive Resolutionという機能を使用できます
知らなかった!
Sceneビュー非表示
実行中にシーンビューを動かしていると重い。
その他設定
テクスチャ、オーディオなどの設定を一括で変えられる。
Unity アセット内のテクスチャやモデル、オーディオの圧縮を一括で設定できるツールを作りました!
— 神城アオイ/AoiKamishiro (@aoi3192) 2020年6月19日
AssetsCompressor1.0 | 神城工業 https://t.co/cF19x3NNSz #booth_pm
使わないでも、どこを変えているかを知って勉強になった
オーディオファイル
オーディオファイルのSampleRateはデフォルトで44100だが、22,050などにしても通常問題ない。ファイルサイズと実行時のメモリ容量を減らせる
Applyして、再生して確認するいい。
ちなみに破壊音は11,025にしたら明らかに音が変わった
Mesh
インポートしたモデルの設定で圧縮率を変えられる