【Unity】アプリが重い時はProfilerやFrameDebuggerを活用しよう

DEVELOP, Unity

アプリ開発の途中、幾度となく訪れる最適化フェーズ。特に開発後半になるとデバッガー、プランナーからは「なんかわからないけど重いです」と言われてストレスを貯めたりなんてこと、てありませんか?そんな時は深呼吸して、冷静に検証を進めてみることが吉です。

Profilerでアプリが重い原因を調べる

まずは、どこに負荷がかかっているのかが分からないと何も始まらないので、ひとつひとつ調べましょう。有難いことにUnityには標準でProfilerが付いています。これを見ることで大抵の処理負荷の原因を突き止めることが出来ます。

 

ボトルネックはCPUなのか、GPUなのか?

Profilerを確認しつつ、処理負荷がCPUなのか、GPUどちらの割合が高いか確認します。事

CPU負荷であれば、

  • ログ出力
  • ファイルアクセス
  • シェーダーの動的コンパイル

この辺りを確認します。意外とリリース相当のビルドで、ログが出たままのアプリを見かけますが、特にモバイル端末では、ログ出力が激重なので無効化しましょう。ファイルアクセスに関しても、できる限りAsync系の関数で処理する様に勤めましょう。画面が固まる原因になります。そして意外と落とし穴がシェーダーの動的コンパイルです。これが非常に重い(Shader.Perse関数)。なるべくシェーダー数が意味のあるカテゴリに分け、数を抑えます。例えばカードゲームを作っていてカード毎に見た目を変えたいからといってそれぞれ固有のシェーダーを割り当ててしまうと元も子もないです。画面がカクカクして辛いです。

 

GPU負荷であれば

  • Draw Call 数
  • フィルレート(Overdraw)

この辺りを確認します。DrawCallは簡単に言えば描画グループ数。この単位でまとめて、この回数描画コマンドを発行します。少なければ少ないほど良いです。フィルレートに関しては、Sceneタブ左上のShadedからOverdrawを選択すると確認できます。

 

色が濃く、重なり合っている所が負荷となっている部分です。

 

FrameDebuggerで描画の処理順を調べる

フィルレートを見て重い所がザックリと分かれば、具体的に描画の処理内容を調べるために、Frame Debuggerを使うと良いです。Frame DebuggerはProfilerを開いている状態であれば、「Rendering」項目に「Open Frame Debugger」があるのでここから開くことが出来ます。

開くと、描画順が目視できるので、要チェック。

大抵の負荷はここで分かる。Meshの頂点数が多すぎるだとか、Materialを小分けにし過ぎているとか。ひとつひとつ見ていきましょう。

まとめ

アプリが重い時は焦らず落ち着いてProfilerを活用し、ひとつひとつ解決していきましょう。

Posted by kazupon