なんとかするから、なんとかなる

エンジニア関係のことを書きます

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で見た方がいい。

描画負荷を深掘りしたい場合

  • iOSならXcode
  • Androidなら各GPUメーカーによって問い合わせ、Tegra, SnapDragonなどのによって変わるので注意