【Unity】Profiling Core APIを使ってProfilerに表示する情報を拡張する

UnityのProfiling Core APIを使ってProfilerに表示する情報を拡張する方法についてまとめました。

Unity2021.2b7
Unity Profiling Core API 1.0.0-pre.1(プレビュー版の情報です)

はじめに

CEDEC2021の以下の講演でUnity Profiling Core APIなるものが紹介されていました。

learning.unity3d.jp

これはProfilerの低レベルAPIをラップするもののようです。

note.com

これを使うとプロファイリングした情報に任意のメタデータを埋め込んだり、

f:id:halya_11:20210902192700p:plain
メタデータ

独自のカウンターグラフを作ったりできるようです。

f:id:halya_11:20210902192735p:plain
独自のグラフ

本記事ではこのパッケージの使い方についてまとめます。

インストール

インストールはPackage Managerから行います。

Package Manager > +ボタン > Add package by name から com.unity.profiling.core と入力してインストールします。

f:id:halya_11:20210902190025p:plain
install

ProfilerMarkerをCustomSamplerのように使う

それではまずProfilerMarkerから使ってみます。
ProfilerMarkerを使うとCustomSamplerのように、任意の区間の処理時間を計測できます。
CustomSamplerについては以下の記事を参照してください。

light11.hatenadiary.com

ProfilerMarkerをCustomSamplerのように使うには以下のように記述します。

using Unity.Profiling;
using UnityEngine;

public class Example : MonoBehaviour
{
    private static readonly ProfilerMarker ProfilerMarker = new("Example");

    private void Update()
    {
        ProfilerMarker.Begin();
        Debug.Log("example");
        ProfilerMarker.End();
    }
}

これで指定した区間が指定した名前でProfiler上に表示されるようになりました。

f:id:halya_11:20210902191243p:plain
表示された

またusingを使って以下のように記述することもできます。

using Unity.Profiling;
using UnityEngine;

public class Example : MonoBehaviour
{
    private static readonly ProfilerMarker ProfilerMarker = new("Example");

    private void Update()
    {
        using (ProfilerMarker.Auto())
        {
            Debug.Log("example");
        }
    }
}

メタデータを埋め込む

次にプロファイリング情報にメタデータを埋め込んでみます。
数値型を埋め込む場合には以下のようにGenericなProfilerMarkerを使います。

using Unity.Profiling;
using UnityEngine;

public class Example : MonoBehaviour
{
    private static readonly ProfilerMarker<int> ProfilerMarker = new("Example", "FrameCount");

    private void Update()
    {
        using (ProfilerMarker.Auto(Time.frameCount))
        {
            Debug.Log("example");
        }
    }
}

これを再生すると、以下のようにメタデータの埋め込まれたプロファイリング情報が得られます。

f:id:halya_11:20210902191721p:plain
Metadata

また、string型の場合は以下のようにProfilerMarker.Beginを使用します。

using Unity.Profiling;
using UnityEngine;

public class Example : MonoBehaviour
{
    private static readonly ProfilerMarker ProfilerMarker = new("Example");

    private void Update()
    {
        ProfilerMarker.Begin("test");
        Debug.Log("example");
        ProfilerMarker.End();
    }
}

独自のカウンターグラフを作成する

次に独自のカウンターグラフを作成します。
まず以下のようにProfilerCounterを作成します。

using Unity.Profiling;
using UnityEngine;

public class Example : MonoBehaviour
{
    private static readonly ProfilerCounter<int> Counter =
        new(ProfilerCategory.Scripts, "Example", ProfilerMarkerDataUnit.Count);

    private int _count;
    
    private void Update()
    {
        Counter.Sample(_count++);
    }
}

次にProfilerにこのグラフを追加します。
ProfilerのProfiler Modulesから歯車ボタンを押し、Profiler Module Editorが開いたらAddボタンを押下します。
左側に自身で定義したカウンターが出てくるので、ダブルクリックでモジュールに追加します。
もし定義したカウンターが出てこなかったらUnityを再起動してみてください(手元の環境では必要だった)。

f:id:halya_11:20210902195233p:plain
ProfilerModuleEditor

あとは再生すれば、追加したグラフに情報が表示されます。

f:id:halya_11:20210902195421p:plain
追加したグラフ

ちなみにProfilerCounterValueを使えば、以下のように値を書き換えてそのフレームの結果を記録することができます。

using Unity.Profiling;
using UnityEngine;

public class Example : MonoBehaviour
{    
    private static ProfilerCounterValue<int> Counter = new(ProfilerCategory.Scripts, "Example",
        ProfilerMarkerDataUnit.Count, ProfilerCounterOptions.FlushOnEndOfFrame);

    private void Awake()
    {
        Counter.Value++;
    }
    
    private void OnDestroy()
    {
        Counter.Value--;
    }
}

関連

light11.hatenadiary.com

参考

learning.unity3d.jp

docs.unity3d.com

note.com