UnityのProfilerで細かい処理時間の計測はCustomSamplerを使うのが手っ取り早いという話です。
Unity2020.2.7f1
はじめに
この記事では、UnityのProfilerで細かい処理時間を計測する際に、
Deep ProfilingをしてもいいけどCustomSamplerクラスを使ったほうが楽だよねという話についてまとめます。
Profilerの基礎についてはこの記事では説明しませんが、
以下の記事にまとめていますので必要に応じて参照してください。
重い処理を計測する
いま、以下のように重い処理がUpdateで行われているとします。
using System.Threading; using UnityEngine; public class Example : MonoBehaviour { private void Update() { // 重いメソッドをUpdateから呼ぶ Foo(); } // 重いメソッド private void Foo() { Thread.Sleep(10); } }
このあたりの処理をProfilerを使って計測してみます。
Deep Profilingを使わずに計測すると以下のような結果が得られます。
Example.Update()
に時間が掛かっていることはわかるものの、
Update内のどのメソッドに時間が掛かっているかなど、それ以上のことはわかりません。
Deep Profilingする
ここでDeep Profilingを使うと、末端の細かいメソッドまでProfiler上に表示することができます。
Deep ProfilingはProfilerのツールバーのDeep Profileボタンを押下することで有効にできます。
下図はDeep Profilingで計測した結果です。
Example.Foo()
とExample.Bar()
の処理時間まで計測されていることが確認できます。
このようにDeep Profilingは便利ですが、プロジェクトが大きくなると非常に計測に時間が掛かってしまうという欠点があります。
CustomSamplerを使う
このようなケースでは、Deep Profilingの代わりにCustomSamplerクラスを使うのが有効です。
CustomSamplerを使うと指定した範囲の処理時間を、指定した名前でProfilerに表示できます。
ソースコードは以下のようにします。
using System.Threading; using UnityEngine; using UnityEngine.Profiling; public class Example : MonoBehaviour { private readonly CustomSampler _fooSampler = CustomSampler.Create($"{nameof(Example)}.{nameof(Foo)}"); private readonly CustomSampler _barSampler = CustomSampler.Create($"{nameof(Example)}.{nameof(Bar)}"); private void Update() { // Fooメソッドを計測 _fooSampler.Begin(); Foo(); _fooSampler.End(); // Barメソッドを計測 _barSampler.Begin(); Bar(); _barSampler.End(); } private void Foo() { Thread.Sleep(5); } private void Bar() { Thread.Sleep(10); } }
説明はコメントに書いた通りです。
これを使って計測を行うと下図のような結果が得られます(Deep Profilingは止めておきます)。
指定した範囲の処理時間が指定した名前で表示されていることが確認できました。