#概要
Unityのスクリプト上からProfilerウィンドウの中のデータを取得する機能の紹介。
サンプルは下記リポジトリ。
https://github.com/KTA552/UnityProfilerCapture
作成環境
Unity 2018.1.4f1
#目的
処理負荷の計測を行う際、UnityのProfilerを使用するが、負荷が高いところを探すのにツリーをいちいち展開していく必要があるため、それが結構手間で面倒くさかった。
重い処理が特定出来ている場合は、Profilerの名前検索などでフィルター出来るが、既に名前が特定出来ている場合に限られてしまう。
そのため、Profilerで計測されている中身を全部精査してSelfTimeや全体の割合を関数単位で見られるように出来ると楽になるので作成しました。
なお、既に負荷を計測したいものがわかっているなら普通にUnityのProfiler.Recorderを使用するのが楽だと思います。
Unity - Scripting API: Recorder
https://docs.unity3d.com/ScriptReference/Profiling.Recorder.html
#やること
- Profilerが保持しているProfilerPropertyのルートを取得する
- 取得したProfilerPropertyの中から必要なデータを取得。
- ProfilerPropertyの子供がいなくなるまで繰り返し行う。
上記2点。
その後データを加工したりソートしたり出力したりはご自由に。
実際に機能しているUnityのツールのコードは下記リポジトリのコード。
UnityProfilerCapture/ProfilerCapture.cs
https://github.com/KTA552/UnityProfilerCapture/blob/master/Assets/%20Debug/ProfilerCapture.cs
#サンプルコード
ProfilerPropertyの取得
ProfilerのRoot情報を取得します。
SetRootのフレーム指定で-1しているのは、ProfilerWindowに表示されているCurrentFrameと1つずれたフレームの情報が取れてしまうためです。
第2引数は取得するProfilerPropertyのソート順を指定します。TotalTimeやSelfPercentなど指定出来ます。
第3引数はProfilerWindowから取得するカテゴリを指定します。
Timelineとか指定すればProfilerのTimelineの情報が取得出来ると思います。それはやったことないので知りません。
// ProfilerのRoot情報を取得
var property = new ProfilerProperty();
property.SetRoot(_captureIndex - 1, ProfilerColumn.SelfTime, ProfilerViewType.Hierarchy);
###ProfilerPropertyから情報を取得
property.NextをすることでcurrentのPropertyのヒエラルキーの次の階層へ移動します。
Nextの引数は自身の子供も含めて次の階層へ向かうかのオプションです。
サンプルの中では、Rootから丸ごと情報を取得しているため結構大量のPropertyが取得できてしまうため、
SelfTimeで適当な負荷以上のものだけデータを取得するようにしています。
// ネストする子供がいなくなるまで回す
while (property.Next(true))
{
var value = property.GetColumnAsSingle(ProfilerColumn.SelfTime);
// 根こそぎ取れるので適当なしきい値で切る
if (value > 0.01)
{
_logText += String.Format("{0}, {1}, {2}. \n",
property.GetColumn(ProfilerColumn.FunctionName),
property.GetColumn(ProfilerColumn.SelfTime),
property.GetColumn(ProfilerColumn.SelfPercent));
}
}
#参考
UnityCsReference/ProfilerWindow.cs
https://github.com/Unity-Technologies/UnityCsReference/blob/57f723ec72ca50427e5d17cad0ec123be2372f67/Modules/ProfilerEditor/ProfilerWindow/ProfilerWindow.cs
ProfilerProperty.Next, UnityEditorInternal C# (CSharp) Method Code Examples - HotExamples
https://csharp.hotexamples.com/examples/UnityEditorInternal/ProfilerProperty/Next/php-profilerproperty-next-method-examples.html
第6章 EditorGUI (EdirotGUILayout) - エディター拡張入門
https://anchan828.github.io/editor-manual/web/part1-editorgui