プロファイラーカウンターの可視化
Add profiler counters to custom Profiler modules.
読み終わるまでの所要時間 11 分最終更新 1ヶ月前
プロファイラーカウンターにコードを追加すると、Profiler ウィンドウ、またはアプリケーションのビルドで可視化することができます。
Profiler ウィンドウでのカスタムカウンターの可視化
ProfilerCounterProfilerCounterValueコードへのメトリクスの追加
以下の例は、GameManager クラスが高レベルのロジックを処理し、敵について知っていることを前提としています。カウンターの値を更新するには、 メソッドまたは メソッドで (ロジックが敵のスポーンまたは破壊とともに実行されるタイミングに応じて)、 メソッドを使用して敵のカウント値をプロファイラーにプッシュします。
UpdateLateUpdateSampleusing UnityEngine;using Unity.Profiling;class GameManager : MonoBehaviour{ Enemy[] m_Enemies; void Update() { GameStats.EnemyCount.Sample(m_Enemies.Length); }}
この例では、弾丸の数をプロファイラーに渡すために、弾丸のライフライフサイクルを管理するシェルスクリプトがあることを前提としています。その後、 で の値を増やし、 で値を減らすことで、ゲーム内の現在の弾丸の流れに関する正確な情報を提供します。
AwakeGameStats.BulletCountOnDestroyusing UnityEngine;using Unity.Profiling;public class Shell : MonoBehaviour{ void Awake() { GameStats.BulletCount.Value += 1; } void OnDestroy() { GameStats.BulletCount.Value -= 1; }}
**注:**Unity は、開発ビルド以外では と の両方をコンパイルします。
ProfilerCounterProfilerCounterValueProfiler ウィンドウにカスタムモジュールを追加する
プロファイラーモジュールエディターを使用して、ビルトインまたは新しく追加したカウンターを可視化の対象として選択します。プロファイラーモジュールエディターを開くには、以下のようにします。
- Profiler ウィンドウを開きます (Window > Analysis > Profiler を選択します)。
- ウィンドウの左上にある Profiler Module ドロップダウンを選択します。歯車アイコンを選択すると、新しいウィンドウが開いてプロファイラーモジュールエディターが表示されます。
- Add を選択し、可視化したいカウンターを、ウィンドウの右側の User リストから選択します。
**重要:**Profiler ウィンドウにデータをロードしていないと、作成したカウンターは、プロファイラーモジュールエディターをロードしたときに Available Counters ペインに表示されません。カスタムカウンターを表示するには、作成したカウンターを含むデータをプロファイラーでキャプチャまたはロードして、プロファイラーモジュールエディターを再度開きます。
その後、Profiler ウィンドウで他のカウンターと一緒にデータを表示することができます。詳細については、カスタムプロファイラーモジュールの作成を参照してください。

Profiler ウィンドウでカスタムカウンターを持つモジュール。
**注:**静的として宣言されたカウンターは、型を初期化する際に C# コードで動的に初期化されます。実際に初期化され、使用するまで利用できない場合があります。これは編集モードと再生モードの両方に適用されます。プロファイラーモジュールエディターにカウンターが表示されない場合は、まずプロファイラーで数フレーム分のデータを記録してください。
ビルドされたプレイヤーでプロファイラーカウンターを可視化する
ビルドされたプレイヤーでプロジェクトを実行した場合、Profiler ウィンドウにはアクセスできません。ただし、ビルドされたプレイヤーで UI 要素としてカウンターを表示することができます。つまり、アプリケーションのビルドにプロファイリングツールを入れることができます。
以下の画像は、ビルドされたプレイヤーでカスタム UI を使用して、シーンの左上にカウンターを表示しています。

カスタム情報がオーバーレイされた Tanks ゲーム
注:(開発ビルドではない) リリース版のプレイヤーでは、すべてのプロファイラーカウンターを利用できるわけではありません。 を使用して、データが利用可能で、プロファイラーがデータを記録できるかどうかを判断します。または、 を使用して、使用可能なすべてのプロファイラー統計を列挙することができます。
ProfilerRecorder.ValidProfilerRecorderHandle.GetAvailableプレイヤーでカウンター値を取得する
プロファイラーのカウンターは、ゲームやエンジンシステムの重要なメトリクスに関するインサイトを提供します。継続的なインテグレーション設定がある場合、またはテスト再生中にアプリケーションの主要なパフォーマンス指標を視覚化したい場合は、 API を使用してカスタムおよびビルトインプロファイラーのカウンター値を取得できます。
ProfilerRecorder例えば、以下のスクリプトは、フレーム時間、Mono/IL2CPP ヒープサイズ、およびアプリケーションが使用するメモリの合計量を表示します。
using System.Collections.Generic;using System.Text;using Unity.Profiling;using UnityEngine;public class StatsScript : MonoBehaviour{ string statsText; ProfilerRecorder systemMemoryRecorder; ProfilerRecorder gcMemoryRecorder; ProfilerRecorder mainThreadTimeRecorder; double GetRecorderFrameAverage(ProfilerRecorder recorder) { var samplesCount = recorder.Capacity; if (samplesCount == 0) return 0; double r = 0; unsafe { var samples = stackalloc ProfilerRecorderSample[samplesCount]; recorder.CopyTo(samples, samplesCount); for (var i = 0; i < samplesCount; ++i) r += samples[i].Value; r /= samplesCount; } return r; } void OnEnable() { systemMemoryRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "System Used Memory"); gcMemoryRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Memory, "GC Reserved Memory"); mainThreadTimeRecorder = ProfilerRecorder.StartNew(ProfilerCategory.Internal, "Main Thread", 15); } void OnDisable() { systemMemoryRecorder.Dispose(); gcMemoryRecorder.Dispose(); mainThreadTimeRecorder.Dispose(); } void Update() { var sb = new StringBuilder(500); sb.AppendLine($"Frame Time: {GetRecorderFrameAverage(mainThreadTimeRecorder) * (1e-6f):F1} ms"); sb.AppendLine($"GC Memory: {gcMemoryRecorder.LastValue / (1024 * 1024)} MB"); sb.AppendLine($"System Memory: {systemMemoryRecorder.LastValue / (1024 * 1024)} MB"); statsText = sb.ToString(); } void OnGUI() { GUI.TextArea(new Rect(10, 30, 250, 50), statsText); }}
重要: を使用して、 に関連付けられたアンマネージリソースを解放します。
ProfilerRecorder.DisposeProfilerRecorderエディターのプロファイラーフレームデータからカウンター値を取得する
エディターでプロファイラーフレームデータを処理するときにプロファイラーカウンターの値を取得するには、 API を使用します。
FrameDataViewFrameDataView.GetCounterValueAsIntFrameDataView.GetCounterValueAsLongFrameDataView.GetCounterValueAsFloatFrameDataView.GetCounterValueAsDoubleusing UnityEditor.Profiling;class Example{ static int ExtractMyCounterValue(FrameDataView frameData, string counterName) { var counterMarkerId = frameData.GetMarkerId(counterName); return frameData.GetCounterValueAsInt(counterMarkerId); }}