うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】特定のコードの Profiling を行う

コードをプロファイリングするために Profiler.BeginSample Profiler.EndSample が用意されている

Unity - Scripting API: Profiling.Profiler.BeginSample

コードのプロファイリングするには以下のように記述すればいけますが

private void Awake()
{
    Profiler.BeginSample("BeginSample");
    // Profiling Code
    Profiler.EndSample();
}

using で利用できたほうが便利なので、IDisposable を継承し using で利用できるクラスを作成

public class ProfilingSampleScope : IDisposable
{
    public ProfilingSampleScope(string name)
    {
        UnityEngine.Profiling.Profiler.BeginSample(name);
    }

    public void Dispose()
    {
        UnityEngine.Profiling.Profiler.EndSample();
    }
}

サンプルコード

using System;
using System.Linq;
using UnityEngine;
 
public class SampleMonoBehaviour : MonoBehaviour
{
    private void Start()
    {
        using (new ProfilingSampleScope("For Loop From Start"))
        {
            Enumerable.Range(0, 100);
        }
    }
 
    private void Update()
    {
        using (new ProfilingSampleScope("For Loop From Update"))
        {
            for (int i = 0; i < 100000; i++) ;
        }
    }
}

プロファイリング

Window/Analisys/Profiler より Profiler Window が開くので
これを開いた状態で実行すると先程のサンプルで指定した名前で検索することで実行時間等を知ることができます
f:id:hacchi_man:20200615001915p:plain:w400

なぜか Update が2回呼ばれていますが、速度やGCなどを見ることができました
起動が遅い等あれば調べてみるとなにか発見があるかもしれません

f:id:hacchi_man:20200615001851p:plain