先日のCEDEC 2018の資料です。
プロファイルに関する幾つかのアップデートが紹介されています。出来なかった事が出来るようになっている部分もあるので、一度見るオススメです。
要約(プロファイル関連)
Time.realtimeSinceStartupで正しい時間を取得
タイムスケールに依存する時間ではなくリアルタイムな時間を取得します。
差分で処理時間を計測するならコレがオススメです。
Player Loopでプロファイラーを繋がずとも負荷を計測
PlayerLoopとTime.realtimeSinceStartupを組み合わせてリアルタイムに処理時間を計測しようというアイディアです。
個人的にはこの用途にPlayerloopを使うのは少し危険じゃないかなという気がしていますが、面白いアイディアでもあります。
(導入の順番や上書き等で面白おかしいデータになりそうな)
Recorder APIで処理時間を取得
ProfilerのRecorderが実行時にスクリプトから処理時間が取得出来るので、それを使用して負荷を計測する的なアプローチです。
PlayerLoopと異なり、全スレッドの累計時間を取ります。
メモリを消費しているアセットの把握
Profiler APIを使用してメモリ使用量を把握するか、Resources APIで利用中のアセットを全取得という感じのアプローチを紹介しています。
FindObjectsOfTypeAllで読み込んでるアセットを全取得は面白いアイディアです
主にプロファイラーに繋げない環境で便利そう。
プロファイラーの書き出しについて
プロファイル結果をファイルに書き出すAPIと、300フレーム以上の結果を確認しやすくするエディター拡張の紹介です。
300フレーム制限、本当に何で存在するんでしょう
要約(新機能情報)
実機上でのプロファイラー動作が高速化(2017.3+)
Unity 2017.3以降は、送信する情報や集計方法を整理することでかなり高速になります。
ただ以前のバージョンのプロファイリング結果と互換性がなくなるっぽいです。
実機上でのDeep Profiling(2017.3+)
引数に「-deepprofiling」を渡すと実機でもDeep Profilingが可能に(.NET 4系かつMono限定)
androidはadb shell am start -n [パッケージ名]/ [アクティビティ名] -e “unity -deepprofiling" で行けるみたいです。
ユーザーThread(.NETのスレッド)にプロファイラーが対応(2017.3+)
BeginThreadProfiling / EndThreadProfilingで、.NET側で作成したスレッドをプロファイラーに載せられるように。
Unity 2018.3から自動登録されるので、把握は簡単になりそうです。
ジョブシステムが既にスレッドを目一杯使用しているので、観測できるからとスレッド使いまくるとコンテキストスイッチ等で大変なことになりそう
Native Plugin Callback(Unity 2018.2+)
プロファイラーのタイムライン相当の情報をフックして構築
上手く使うと、Systraceで見れる謎のプロセスの中身が分かるようになります。だから何が出来ると言われると微妙な機能ですが、頑張れば色々できそう
IL2CPPでScript Debugging(2018.2)
IL2CPP変換後の結果とC#コードがバインド出来るようになるみたいです。
これでiOSビルド後のバグが追いやすくなります。
.NET 4系のみです。
新しいMemoryProfiler
Memory Profiler Extensionがエディターに統合されます。
感想
プロファイリング関連は常に最新を追っていきたいですね。
色んな最適化Tipsはありますが、結局ゲームに一致してるのかはプロファイルしてみないと分からないので、そこのところを出来るだけ楽したい心です。
Unite Berlin 2018 - Unity's Evolving Best Practices - YouTube