コードに プロファイラーマーカー を追加して、Profiler ウィンドウ の CPU Usage モジュール の Timeline ビュー と Hierarchy ビュー に、ProfilerMarker.Begin、ProfilerMarker.End、または ProfilerMarker.Auto が生成するサンプルを表示します。
*
一部の例では Profiling Core パッケージ を使用します。これは開始前にインストールする必要があります。Unity Profiling Core パッケージはコアパッケージであるため、Package Manager UI では検出できません。パッケージをインストールするには、以下のいずれかを実行します。
ProfilerMarker API を使用するには、プロファイルするコードを ProfilerMarker.Begin 呼び出しと ProfilerMarker.End 呼び出しの間に配置します。以下に例を示します。
using UnityEngine;
using Unity.Profiling;
public class ProfilerMarkerExample
{
static readonly ProfilerMarker k_MyCodeMarker = new ProfilerMarker("My Code");
void Update() {
k_MyCodeMarker.Begin();
Debug.Log("This code is being profiled");
k_MyCodeMarker.End();
}
}
注:プロファイラーマーカーの名前に / 文字を使用しないでください。Profiler ウィンドウが CPU Profiler モジュールのチャートビューでマーカーを強調表示できなくなります。
End が呼び出される前に、Begin 呼び出しと End 呼び出しの間のコードがスコープ外に出ないようにしてください。End が呼び出される前にコードがスコープを出ると、エラーメッセージがコンソールに記録されます。return のたびに End を呼び出す必要がないようにするには、Auto を使用して、サンプルがスコープから出るときに自動的に終了するようにします。詳細については、このドキュメントの プロファイラーマーカーのコードブロックの自動終了 セクションを参照してください。
Unity は、プロファイルされたコードブロックの実行時間を記録してプロファイラーに報告し、Deep Profiling を使用せずに CPU Profiler モジュール に表示します。以下のように、CPU Profiler モジュールの Hierarchy ビュー に新しいエントリーとして表示されます。
ProfilerMarker.Auto を使用して、コードブロックの終了時に ProfilerMarker.End が自動的に呼び出されるようにします。以下の呼び出しは同等です。
using Unity.Profiling;
public class MySystemClass
{
static readonly ProfilerMarker k_UpdatePerfMarker = new ProfilerMarker("MySystem.Update");
public void Update()
{
k_UpdatePerfMarker.Begin();
// ...
k_UpdatePerfMarker.End();
using (k_UpdatePerfMarker.Auto())
{
// ...
}
}
}
Begin() 呼び出しと End() 呼び出しとは異なり、Unity は開発以外の (リリース) ビルドで ProfilerMarker.Auto 呼び出しをコンパイルで除外できません。ただし、代わりに null を返すため、オーバーヘッドは最小限になります。
ProfilerMarker.Auto を using var とともに使用することもできます。現在のスコープが終了すると、End 呼び出しが自動的に発生します。このアプローチでは、コードに ProfilerMarker インスタンスを追加するときに変更する必要のあるコードの量が最小限に抑えられます。
using Unity.Profiling;
public class MySystemClass
{
static readonly ProfilerMarker k_UpdatePerfMarker = new ProfilerMarker("MySystem.Update");
public void Update()
{
using var _ = k_UpdatePerfMarker.Auto();
// ...
}
}
注:ProfilerMarker でマークアップされたエリア内の async await 呼び出しおよび yield 呼び出しはサポートされておらず、Auto を使用している場合でもコンソールにエラーメッセージが記録されます。
コードサンプルにコンテキストを追加して、コードが長時間実行される特定の条件を特定する必要がある場合があります。
例えば、システムがオブジェクトのシミュレーションを実行する場合、プロファイラーサンプルでオブジェクトの数を渡すことができます。プロファイラーが長いサンプル継続時間とともに異常な数値を返す場合は、シミュレーションに別のスレッドを使用するか、CPU 処理を複数のフレームに分割するか (タイムスライス)、アプリケーションの設計を調整してフレーム落ちを防ぐ必要がある可能性があります。
ProfilerMarker は、ProfilerMarker<TP1>、ProfilerMarker<TP1, TP2>、ProfilerMarker<TP1, TP2, TP3> の 3 つの数値パラメーターまでサポートします。
using Unity.Profiling;
public class MySystemClass
{
static readonly ProfilerMarker<int> k_PreparePerfMarker = new ProfilerMarker<int>("MySystem.Prepare", "Objects Count");
static readonly ProfilerMarker<float> k_SimulatePerfMarker = new ProfilerMarker<float>(ProfilerCategory.Scripts, "MySystem.Simulate", "Objects Density");
public void Update(int objectsCount)
{
k_PreparePerfMarker.Begin(objectsCount);
// ...
k_PreparePerfMarker.End();
using (k_SimulatePerfMarker.Auto(objectsCount * 1.0f))
{
// ...
}
}
}
ProfilerMarker API では、プロファイラーマーカーに文字列パラメーターを追加できます。文字列パラメーターは、アプリケーションがレベルまたはデータのファイルをロードするときにレベルまたはファイルの名前を表示したい場合に便利です。ProfilerMarkerExtension メソッドを使用して、プロファイラーサンプルとともに文字列パラメーターを渡します。
using Unity.Profiling;
public class MySystemClass
{
static readonly ProfilerMarker k_PreparePerfMarker = new ProfilerMarker("MySystem.Prepare");
public void Prepare(string path)
{
k_PreparePerfMarker.Begin(path);
// ...
k_PreparePerfMarker.End();
}
}