![見出し画像](https://assets.st-note.com/production/uploads/images/24299554/rectangle_large_type_2_420694d795b6d7d9ecda3633c7fddee9.png?width=1200)
Unity Profilerに、画像を仕込みました
UnityのProfilerを使っていて、「あー、何か負荷が高いけど…この時って画面がどんな表示だったかなぁー」って思うことありませんか?
そんなわけでUnityのAPI 「Profiler.EmitMetadata」を使って、スクリーンショットの画像を埋め込んでみました。
こちらが一式になります。2019.3以上を対象としています。
また GPUAsyncReadbackをサポートする必要があるため、モバイルだとVulkan/Metalが必要になります。
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での動作を確認しました
この記事が気に入ったらサポートをしてみませんか?