UnityのProfiling Core APIを使ってProfilerに表示する情報を拡張する方法についてまとめました。
Unity2021.2b7
Unity Profiling Core API 1.0.0-pre.1(プレビュー版の情報です)
はじめに
CEDEC2021の以下の講演でUnity Profiling Core APIなるものが紹介されていました。
これはProfilerの低レベルAPIをラップするもののようです。
これを使うとプロファイリングした情報に任意のメタデータを埋め込んだり、
独自のカウンターグラフを作ったりできるようです。
本記事ではこのパッケージの使い方についてまとめます。
インストール
インストールはPackage Managerから行います。
Package Manager > +ボタン > Add package by name から com.unity.profiling.core と入力してインストールします。
ProfilerMarkerをCustomSamplerのように使う
それではまずProfilerMarkerから使ってみます。
ProfilerMarkerを使うとCustomSamplerのように、任意の区間の処理時間を計測できます。
CustomSamplerについては以下の記事を参照してください。
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上に表示されるようになりました。
また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"); } } }
これを再生すると、以下のようにメタデータの埋め込まれたプロファイリング情報が得られます。
また、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を再起動してみてください(手元の環境では必要だった)。
あとは再生すれば、追加したグラフに情報が表示されます。
ちなみに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--; } }