見出し画像

Unity Profilerに、画像を仕込みました

UnityのProfilerを使っていて、「あー、何か負荷が高いけど…この時って画面がどんな表示だったかなぁー」って思うことありませんか?

そんなわけでUnityのAPI 「Profiler.EmitMetadata」を使って、スクリーンショットの画像を埋め込んでみました。

こちらが一式になります。2019.3以上を対象としています。
また GPUAsyncReadbackをサポートする必要があるため、モバイルだとVulkan/Metalが必要になります。

画像1

Packageとしてプロジェクトに組み込んで、下記を呼び出すだけで良いです。

UTJ.SS2Profiler.ScreenShotToProfiler.Instance.Initialize();

ランタイム側では、大枠では下記のような実装になっております。
( GPUAsyncReadbackでの時間差を考慮して工夫もしていますが…そこは端折ります)

1.ScreenShotを縮小したRenderTextureに書き出し
2.RenderTextureをGPUAsyncReadbackで画像の読み込み
3.Profiler.EmitMetadataでGPUから取得してきたTextureのBinaryを埋め込み

縮小したRenderTextureに焼き直しているのは、容量や負荷を考慮してわざと落としています。

今は 192*128を標準的なサイズにしています。現在TextureはRGBAの32bitを素のまま送っています。
これならば1フレーム当たり96KByte。60フレームならば 5.6MBちょっとの追加になるので許されそうな気がしています…。
(αを削って 32bit -> 24bit 、さらにlz4圧縮掛けられたら良いかなぁと思いつつ…今の所 困っていないので一旦コレで…

そんな感じでUnityProfilerにスクショを載せるようにしてみました。

追記:HDRPおよびUniversalRPでの動作を確認しました

画像2

キャプチャ


この記事が気に入ったらサポートをしてみませんか?