Unity Profiler ネイティブプラグインを使用すると、Razor (PS4)、PIX (Xbox、Windows)、Chrome Tracing、ETW、ITT、Vtune、Telemetry などの外部ツールの分析のためにスクリプトを通して Unity からデータを抽出できます。Unity Profiler はイベントを記録し、Profiler ネイティブプラグイン API はこれらのイベントをサードパーティ製のプロファイリング API からアクセス可能にし、関連する分析ツールに渡します。
以下の Unity Profiler 機能は、パフォーマンス分析のための計装データを取得するのに役立ちます。
Categories: Unity はプロファイルデータをカテゴリ (レンダリング、スクリプティング、アニメーションなど) にグループ化し、各カテゴリに色を割り当てます。これにより、Profiler ウィンドウでデータの種類を視覚的に区別するのに役立ちます。Profiler ネイティブプラグイン API を使用すると、これらの色を取得して外部のプロファイラーで使用することができます。
Usage flags: Unity Profiler は、以下の使用に関するフラグをイベントマーカーに適用してデータをフィルタリングします。
Availability flags は、マーカーが Unity エディターか、開発版プレイヤーか、リリース版プレイヤーで使用可能かを示すフラグ。
Verbosity levels はエディターで行っているタスクの種類とタスクが必要とする情報のレベル (例えば、内部、デバッグ、ユーザーレベル) に関連します。
Usage flag を使用すると、外部ツールに渡す前にデータをフィルタリングして生成されるデータの量を削減します。また、外部ツールのデータをフィルタリングして情報のノイズを削減することができます。
Frame events: Profiler ネイティブプラグイン API を使用すると、外部プロファイラーでフレーム時間分析を行うことができます。
Thread profiling: Unity は、スレッド (例えば、メインスレッド、レンダースレッド、ジョブシステムワーカースレッド) 上で著しい量の作業を行います。Profiler ネイティブプラグイン API を使用して、すべてのスレッドでプロファイリングを使用できます。
ネイティブの Profiler プラグイン API は、Unity のサブシステムとサードパーティプロファイリング API 間のインターフェースを提供します。API は IUnityProfilerCallbacks ヘッダーによってアクセス可能になります。この API は、Unity の インストール時に <UnityInstallPath>\Editor\Data\PluginAPI フォルダーに保存されます。
外部プロファイラーで Unity Profiler が生成する計装データを使用するには、以下の最小限のコールバックを使用します。
RegisterCreateCategoryCallback
: Unity がカテゴリを作成するたびに、Profiler はカテゴリ名と色を取得し、このコールバックを登録します。
RegisterCreateMarkerCallback
: Unity がマーカーを作成するたびに、Profiler はマーカー名、カテゴリ、使用フラグを取得し、このコールバックを登録します。UnityProfilerMarkerDesc は永続的なポインターで、RegisterMarkerEventCallback のマーカーをフィルタリングするのに使用できます。
RegisterMarkerEventCallback
: Unity Profiler の外部プロファイラーのプッシュ/ポップマーカーを追跡し、指定されたマーカーのイベントコールバックを登録します。スコープ内の計装イベントまたは単発イベントが発生すると、Unity Profiler は指定されたコールバックを実行します。メモリ割り当てやガベージコレクションのイベントをマーカーとして追跡することもできます。Unity はこれらのイベントをそれぞれ GC.Alloc
と GC.Collect
として表します。
RegisterFrameCallback
: フレームの概念を持たない外部プロファイラーで使用するためにサンプルを論理フレームにカプセル化し、Unity が次の論理 CPU フレームを開始するときに Unity Profiler が実行するコールバックを登録します。
RegisterCreateThreadCallback
: Unity がプロファイリングのためにスレッドを登録するたびに、Profiler は内部スレッド名を取得し、そのスレッドのコールバックを登録します。
次の例は、begin と end イベントを外部プロファイラーに送信する方法を示しています。
| #include <IUnityInterface.h>
# include <IUnityProfilerCallbacks.h><br/>
static IUnityProfilerCallbacks* s_UnityProfilerCallbacks = NULL;
static void UNITY_INTERFACE_API MyProfilerEventCallback(
const UnityProfilerMarkerDesc* markerDesc,
UnityProfilerMarkerEventType eventType,
unsigned short eventDataCount,
const UnityProfilerMarkerData* eventData, void* userData)
{
switch (eventType)
{
case kUnityProfilerMarkerEventTypeBegin:
{
MyProfilerPushMarker(markerDesc->name);
break;
}
case kUnityProfilerMarkerEventTypeEnd:
{
MyProfilerPopMarker(markerDesc->name);
break;
}
}
}
static void UNITY_INTERFACE_API MyProfilerCreateEventCallback(
const UnityProfilerMarkerDesc* markerDesc, void* userData)
{
s_UnityProfilerCallbacks->
RegisterEventCallback(markerDesc, MyProfilerEventCallback, NULL);
}
extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginLoad(IUnityInterfaces* unityInterfaces)
{
s_UnityProfilerCallbacks = unityInterfaces->Get<IUnityProfilerCallbacks>();
s_UnityProfilerCallbacks->
RegisterCreateEventCallback(&MyProfilerCreateEventCallback, NULL);
}
extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginUnload()
{
s_UnityProfilerCallbacks->
UnregisterCreateEventCallback(&MyProfilerCreateEventCallback, NULL);
s_UnityProfilerCallbacks->
UnregisterEventCallback(NULL, &MyProfilerEventCallback, NULL);
}
注意: すべてのマーカーから指定するコールバックを登録解除するには、最初のパラメーターを NULL に設定して UnregisterEventCallback を実行します。
フレームごとに 1 回づつ、マーカーコールバックを動的に登録および登録解除できます。次の例は、サードパーティのプロファイルの状況に応じて、コールバックを有効または無効にすることによって、プロファイリングのオーバーヘッドを最小化する方法を示しています。
| static void UNITY_INTERFACE_API SystraceFrameCallback(void* userData)
{
bool isCapturing = ATrace_isEnabled();
if (isCapturing != s_isCapturing)
{
s_isCapturing = isCapturing;
if (isCapturing)
{
s_UnityProfilerCallbacks->
RegisterCreateMarkerCallback(SystraceCreateEventCallback, NULL);
}
else
{
s_UnityProfilerCallbacks->
UnregisterCreateMarkerCallback(SystraceCreateEventCallback, NULL);
s_UnityProfilerCallbacks->
UnregisterMarkerEventCallback(NULL, SystraceEventCallback, NULL);
}
}
}
注意: コールバックのオーバーヘッドを最小限にするために、キャプチャの間だけコールバックを登録することができます。
Systrace API は、キャプチャが有効かどうかを決定する ATrace_isEnabled API を提供します。これをフレームごとにチェックして、コールバックを動的に有効/無効にすることができます。より高度な使用例については、UnitySystracePlugin リポジトリ を参照してください。
Unity には有用なメタデータを含む以下のマーカーがあります。
Unity が Profiler.BeginSample と Profiler.EndSample イベントのために予約するマーカー。kUnityProfilerMarkerEventTypeBegin eventType
は Profiler.BeginSample
イベントに対応し、以下のデータを持ちます。
Int32: UnityEngine.Object
インスタンスの ID。オブジェクトが指定されていない場合は 0 です。
UInt16 array: Profiler.BeginSample
に渡されるUTF16 文字列。サイズはバイト数です。
UInt32: カテゴリインデックス。
ガベージコレクションの割り当てに対応するマーカー。以下のデータが含まれます。
2019–02–14 公開ページ
低レベル Profiler ネイティブプラグインは Unity [2018.3](../Manual/30_search.html?q = newin20183) で追加 NewIn20183
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.