テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】CPUプロファイラに表示されるの項目をスクリプトで取得する

プロファイラーに表示されるようなCPUの処理時間をスクリプトで取得する方法についてです。

プロファイラーは負荷の高い部分を観測する

処理負荷はゲーム画面のプロファイラやInstrumentsといったツールを使って確認するのがベストなアイディアです。

例えば「ゲームが重い」原因は何か? GC? ロード? 物理演算? それともアニメーション? 軽い部分をいくら調整しても、ボトルネックとなる重い部分を取り除かなければ大抵の場合は余り効果が見込めません。
(むしろ、この世の全てはトレードオフ…悪い結果を呼び出す事もあるかもしれません)

 

何を削れば良いのかはプロファイリングの結果である程度は目星が付けられるので、上手く活用します。

www.slideshare.net

プロファイリングの結果をスクリプトで云々する

プロファイリングは大抵は手動の項目で、実際にゲームをプレイし目で重い所を観測する必要が出てきます。

プロファイラとにらめっこするのもソレはソレで楽しい事ではありますが、スクリプトからある程度取得出来るならば色々と便利そう…と思ったら、する方法がありました。

f:id:tsubaki_t1:20171104232446j:plain

RecorderでProfiler(CPU)の項目を取得

Recorderはプロファイラ(CPU)の項目から、前フレームの処理時間を取得出来るみたいです。例えばBehaviourUpdateを取得する場合は以下のようなコードです。

gist.github.com

取得できる条件はEditorとDevelopment Playersとありますが、Development Playersと言う割にDevelopment Buildで取得できませんでした。何か条件が?

docs.unity3d.com

処理時間がやたら長くなったら止める

この機能で思いついた使い方は、処理を観測して負荷が一定以上になったら止める…という物です。

gist.github.com

またsampleBlockCountで累計の処理呼出カウントも取れるので、余りにも集中的に処理を呼び出している項目を見つけ出す事も出来るかもしれません。

画面に出す

処理時間の結果を画面に出す事も出来ます。

ただグラフ表示されないので、「突出して負荷が上がる瞬間」を観測するのはグラフ表示できるProfilerで見るほうが良いです。

また「だんだんと上がっている」ようなケースでもProfilerで見たほうが、客観的に見れる感じがします。

f:id:tsubaki_t1:20171104224918j:plain

プロファイリングにはCustomSamplerが必要

なお、Recorderの使用には Profiler.BeginSampleではなく CustomSamplerの CustomSampler.Beginを使用します。

自分でスクリプトを記述する場合には、CustomSamplerをいうお話です。

docs.unity3d.com

ちなみに、Profiler.BeginSampleよりもCustomSampler.Beginの方がオーバーヘッドが低いみたいです。

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp