【Unity】Profilerで細かい処理時間の計測はCustomSamplerを使うのが手っ取り早い

UnityのProfilerで細かい処理時間の計測はCustomSamplerを使うのが手っ取り早いという話です。

Unity2020.2.7f1

はじめに

この記事では、UnityのProfilerで細かい処理時間を計測する際に、
Deep ProfilingをしてもいいけどCustomSamplerクラスを使ったほうが楽だよねという話についてまとめます。

Profilerの基礎についてはこの記事では説明しませんが、
以下の記事にまとめていますので必要に応じて参照してください。

light11.hatenadiary.com

重い処理を計測する

いま、以下のように重い処理がUpdateで行われているとします。

using System.Threading;
using UnityEngine;

public class Example : MonoBehaviour
{
    private void Update()
    {
        // 重いメソッドをUpdateから呼ぶ
        Foo();
    }

    // 重いメソッド
    private void Foo()
    {
        Thread.Sleep(10);
    }
}

このあたりの処理をProfilerを使って計測してみます。
Deep Profilingを使わずに計測すると以下のような結果が得られます。

f:id:halya_11:20210518222142p:plain
計測結果

Example.Update()に時間が掛かっていることはわかるものの、
Update内のどのメソッドに時間が掛かっているかなど、それ以上のことはわかりません。

Deep Profilingする

ここでDeep Profilingを使うと、末端の細かいメソッドまでProfiler上に表示することができます。
Deep ProfilingはProfilerのツールバーのDeep Profileボタンを押下することで有効にできます。
下図はDeep Profilingで計測した結果です。

f:id:halya_11:20210518222615p:plain
Deep Profiling

Example.Foo()Example.Bar()の処理時間まで計測されていることが確認できます。

このようにDeep Profilingは便利ですが、プロジェクトが大きくなると非常に計測に時間が掛かってしまうという欠点があります。

CustomSamplerを使う

このようなケースでは、Deep Profilingの代わりにCustomSamplerクラスを使うのが有効です。
CustomSamplerを使うと指定した範囲の処理時間を、指定した名前でProfilerに表示できます。

ソースコードは以下のようにします。

using System.Threading;
using UnityEngine;
using UnityEngine.Profiling;

public class Example : MonoBehaviour
{
    private readonly CustomSampler _fooSampler = CustomSampler.Create($"{nameof(Example)}.{nameof(Foo)}");
    private readonly CustomSampler _barSampler = CustomSampler.Create($"{nameof(Example)}.{nameof(Bar)}");
    
    private void Update()
    {
        // Fooメソッドを計測
        _fooSampler.Begin();
        Foo();
        _fooSampler.End();
        
        // Barメソッドを計測
        _barSampler.Begin();
        Bar();
        _barSampler.End();
    }

    private void Foo()
    {
        Thread.Sleep(5);
    }
    
    private void Bar()
    {
        Thread.Sleep(10);
    }
}

説明はコメントに書いた通りです。
これを使って計測を行うと下図のような結果が得られます(Deep Profilingは止めておきます)。

f:id:halya_11:20210518223052p:plain
CustomSamplerを使った計測結果

指定した範囲の処理時間が指定した名前で表示されていることが確認できました。

関連

light11.hatenadiary.com

参考

docs.unity3d.com