UnityのProfilerはパフォーマンス改善をするときに非常に有用なツールです。
しかしその分機能も多く複雑になっており、理解するための敷板が高くなってしまっています。
そこでこの記事では個人的にパフォーマンス改善に必要だと思う部分のみ簡単にまとめます。
- Profilerとは?
- 基本的な使い方
- CPUプロファイラのHierarchyモードでCPU負荷を見る
- スレッド毎の処理を見るにはCPUプロファイラのTimelineを見る
- セットパスコール数が怪しかったらRenderingプロファイラで確認
- GPUの処理負荷はGPUプロファイラで
- メモリリークを発見するにはMemoryプロファイラ
- 参考
Unity2018.4.0
Profilerとは?
ProfilerとはUnityに組み込まれているツールで、CPUやGPU、メモリの負荷などを可視化することができます。
主にFPSが落ちてしまうアプリのパフォーマンス改善をするときに使用します。
またUnityエディタ上で使うツールですが、iOSやAndroidの端末と接続して端末の処理負荷を計測することもできます。
基本的な使い方
Unityエディタ上で処理負荷を見るには、
- Window > Analysis > Profilerを開いて
- ゲームを再生する
これだけです。
これでCPUなどの計測結果が流れてきます。
もし目的のProfilerが表示されていなかったらAdd Profilerから表示したいProfilerを選択します。
また、iOSやAndroidといったモバイル端末の処理負荷を表示することもできます。
この方法は次の記事にまとめていますので参照してください。
ちなみに計測処理はProfilerウィンドウ左上のRecordボタンでON/OFFできます。
Profilerは表示していない部分の計測結果情報をどんどん破棄するため、
情報が勝手に流れて破棄されたくない場合にはRecordボタンをOFFにします。
CPUプロファイラのHierarchyモードでCPU負荷を見る
CPUの処理負荷を見るにはCPU Usageを見ます。
ウィンドウ下部はHierarchyモードにしておきます。
CPU Usageのグラフ部分をクリックするとそのFrameにおける処理負荷がHierarchyに表示されます。 これで大体どのメソッドの処理負荷が高いかがわかります。
ただこの状態ではすべてのソースコードが計測対象にはなっていません。 より詳しく処理負荷の要因を探るにはDeep Profileを有効にします。
これでより詳細な分析結果が表示されるようになります。
ただ、Deep Profileは非常にオーバーヘッドが大きいので注意が必要です。
大規模なゲームではUnityがメモリ不足になってしまうこともあります。
そういうときには処理負荷を計測したい部分にProfiler.BeginSample()
とProfiler.EndSample()
を仕込みます。
using System.Collections.Generic; using UnityEngine; using UnityEngine.Profiling; public class Example : MonoBehaviour { void Update() { Profiler.BeginSample("This is the example"); // 計測したい処理を書く var text = string.Empty; for (int i = 0; i < 100; i++) { text += "text"; } Profiler.EndSample(); } }
これで、この部分の処理負荷がProfilerに計上されるようになります。
スレッド毎の処理を見るにはCPUプロファイラのTimelineを見る
CPU Usageプロファイラを選択した状態で下部のウィンドウをTimelineモードにすると各スレッドの処理負荷を見ることができます。
横軸がそのフレームにおける処理時間を表しています。
上図ではメインスレッドで重い処理をしているのでメインスレッドに負荷が偏っていますが、
メインスレッド以外で処理負荷が高い処理を行っていると次のような感じで表示されます。
セットパスコール数が怪しかったらRenderingプロファイラで確認
Renderingプロファイラを使うとセットパスコールを見ることができます。
これらはGameビューのStatisticsからも見ることができますが、
iOSやAndroidの端末のセットパスコールを見るときにはProfilerが必要です。
ちなみにセットパスコールなどの説明は下記の記事にまとめています。
GPUの処理負荷はGPUプロファイラで
ただしこれは使える環境に限りがあります。
詳しくは下記マニュアルを参照してください。
また、Player SettingsのGraphics Jobsにチェックが入っていると使えないようです。
加えて注意点としてGPUプロファイラは重いので、使わない時は閉じておきましょうとのことです。
メモリリークを発見するにはMemoryプロファイラ
Memoryプロファイラを使うと生成されているオブジェクトの数が取得できます。
ここでいうオブジェクトとはUnityEngine.Objectを継承したクラスのインスタンスになります。
このオブジェクト数が増え続けている場合、どこかで破棄をミスっている可能性があります。
このようにMemoryプロファイラはメモリリークの検出に役立ちます。