【Unity】Profilerの実用的な使い方!パフォーマンス改善に必要な部分だけサクッとまとめ

UnityのProfilerはパフォーマンス改善をするときに非常に有用なツールです。
しかしその分機能も多く複雑になっており、理解するための敷板が高くなってしまっています。
そこでこの記事では個人的にパフォーマンス改善に必要だと思う部分のみ簡単にまとめます。

Unity2018.4.0

Profilerとは?

ProfilerとはUnityに組み込まれているツールで、CPUやGPU、メモリの負荷などを可視化することができます。
主にFPSが落ちてしまうアプリのパフォーマンス改善をするときに使用します。

docs.unity3d.com

またUnityエディタ上で使うツールですが、iOSAndroidの端末と接続して端末の処理負荷を計測することもできます。

基本的な使い方

Unityエディタ上で処理負荷を見るには、

  1. Window > Analysis > Profilerを開いて
  2. ゲームを再生する

これだけです。
これでCPUなどの計測結果が流れてきます。

f:id:halya_11:20190526214446p:plain

もし目的のProfilerが表示されていなかったらAdd Profilerから表示したいProfilerを選択します。

f:id:halya_11:20190526222429p:plain

また、iOSAndroidといったモバイル端末の処理負荷を表示することもできます。
この方法は次の記事にまとめていますので参照してください。

light11.hatenadiary.com

light11.hatenadiary.com

ちなみに計測処理はProfilerウィンドウ左上のRecordボタンでON/OFFできます。

f:id:halya_11:20190526214622p:plain

Profilerは表示していない部分の計測結果情報をどんどん破棄するため、
情報が勝手に流れて破棄されたくない場合にはRecordボタンをOFFにします。

CPUプロファイラのHierarchyモードでCPU負荷を見る

CPUの処理負荷を見るにはCPU Usageを見ます。
ウィンドウ下部はHierarchyモードにしておきます。

f:id:halya_11:20190526215923p:plain

CPU Usageのグラフ部分をクリックするとそのFrameにおける処理負荷がHierarchyに表示されます。 これで大体どのメソッドの処理負荷が高いかがわかります。

f:id:halya_11:20190526220221p:plain

ただこの状態ではすべてのソースコードが計測対象にはなっていません。 より詳しく処理負荷の要因を探るにはDeep Profileを有効にします。

f:id:halya_11:20190526220313p:plain

これでより詳細な分析結果が表示されるようになります。

f:id:halya_11:20190526221006p:plain

ただ、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に計上されるようになります。

f:id:halya_11:20190526221504p:plain

スレッド毎の処理を見るにはCPUプロファイラのTimelineを見る

CPU Usageプロファイラを選択した状態で下部のウィンドウをTimelineモードにすると各スレッドの処理負荷を見ることができます。

f:id:halya_11:20190526222024p:plain

横軸がそのフレームにおける処理時間を表しています。
上図ではメインスレッドで重い処理をしているのでメインスレッドに負荷が偏っていますが、
メインスレッド以外で処理負荷が高い処理を行っていると次のような感じで表示されます。

f:id:halya_11:20190526221808p:plain

セットパスコール数が怪しかったらRenderingプロファイラで確認

Renderingプロファイラを使うとセットパスコールを見ることができます。

f:id:halya_11:20190526222639p:plain

これらはGameビューのStatisticsからも見ることができますが、
iOSAndroidの端末のセットパスコールを見るときにはProfilerが必要です。

f:id:halya_11:20190526222721p:plain

ちなみにセットパスコールなどの説明は下記の記事にまとめています。

light11.hatenadiary.com

GPUの処理負荷はGPUプロファイラで

GPUプロファイラを使うとGPUの処理負荷が計測できます。

f:id:halya_11:20190526223012p:plain

ただしこれは使える環境に限りがあります。
詳しくは下記マニュアルを参照してください。

docs.unity3d.com

また、Player SettingsのGraphics Jobsにチェックが入っていると使えないようです。
加えて注意点としてGPUプロファイラは重いので、使わない時は閉じておきましょうとのことです。

f:id:halya_11:20190526223141p:plain

メモリリークを発見するにはMemoryプロファイラ

Memoryプロファイラを使うと生成されているオブジェクトの数が取得できます。

f:id:halya_11:20190526223312p:plain

ここでいうオブジェクトとはUnityEngine.Objectを継承したクラスのインスタンスになります。
このオブジェクト数が増え続けている場合、どこかで破棄をミスっている可能性があります。

このようにMemoryプロファイラはメモリリークの検出に役立ちます。

参考

docs.unity3d.com

docs.unity3d.com

docs.unity3d.com

docs.unity3d.com

docs.unity3d.com

tsubakit1.hateblo.jp

docs.unity3d.com