Unite2017 参加しました その7
最適化をする前に覚えておきたい技術
www.slideshare.net
最適化への手順
プロファイリング
処理ごとにかかった時間、メモリの使用状況を把握する。
まずは、Unityのprofiler 詳しく知りたければ、Nativeのprofiler(Xcodeとか)を使う
[window] - [プロファイラー]
対処する
メモリの使用量が多い
- 単純な使用量か、メモリリークか
- C#(MonoMemory)が原因か、Unityが原因か
C#が大きいぞ
- C#はスクリプトで使用しているメモリ。(GCされる)
- C#が確保したメモリは解放されてもC#専用領域として残ってしまう。(reserved) (Editor拡張でもメモリは取られるので、実機で確認する。)
とりあえず スクリプトを修正する
Unityメモリが大きいぞ
- TextutureやMeshなどが原因で、リークの可能性もある。
- ProfilerからAsset毎にメモリ内の容量をチェックできる。その他に公式ツールも存在する。
不必要なアセットなどを削除するようにする
ロードが長い問題
何が長いのか、初期化処理か、ロード時間か、きちんと原因を調べる profilerでロード時間をフレーム毎に見てみる。
[スクリプト].awakeが長い場合は、初期化が辛いことになっている。
- プロフィリングの時はDebugLogは止めるようにする。DebugLogは割と重い。
texture.awakeが重い
無駄なものを読み込んでいないか、やたらとリッチなTextureは存在しないかを確認する。
AssetBundleを使っている場合は、予期せず重複して読み込んでいることがあるので、注意。
一瞬ゲームが固まる問題
- GCが走った場合に起こる現象。
- profilerでCGが起きていないかを確認する。
対策
- C#スクリプトでのメモリの消費を抑える。
- 文字列の置換や検索、足し算は気をつける。
フレームレートが低い問題
FPSのフレーム間で終わらない処理をしてしまったのが原因(30FPSよりも下がると、人の体感で遅く感じてしまう)
- ゲームロジックによる負荷か、描画処理による負荷か
- profilerでrenderingをみることでわかる。
どうする
- 描画ならデザイナーさんとの交渉
- ゲームロジックなら、C#のスクリプトかUnity側の処理か。GameObejctが3000を超え始めたらC#のスクリプトの問題
- BehaviourUpdateをprofilerを見ることでわかる。
- phisicsなんとかで物理が重いのかがわかる。
- insepectorのTimemanagerでフレーム数をきちんと下げると良い。
- UIが重い場合、頂点の計算に時間がかかる
- 何かの変更があれば、すべての頂点を計算し直すため
描画の負荷で考える
- 無駄な描画をしている場合が割と多いので気をつける
- Objectの描画処理はFrameDebuggerで確認することができる。
ちなみに
- 頂点数もprofilerから確認することができる。
- 透明描画や、半透明を塗るのも結構大変。ImageEffectなどもかなり時間がかかる
Shaderはどうですか?
- ピクセル毎に細かく計算するため、気をつける。
- 特に、地面や空は画面の中でかなりの面積をようするため軽めのShaderにすると良い。
Shaderについては各プラットフォームのprofilerで見た方がいい。