#FrameDebuggerの情報を外に書き出してみる試み
FrameDebuggerの中身を書き出す君(作業中)の記事です。
ソースはコチラ
https://github.com/wotakuro/FrameDebuggerSave
何してるの?
上記GIFの様にFrameDebuggerの情報を1ステップずつ舐めていって、ログに書き出すツールを作成してみている記事になります。
動作は今の所2018.4でのEditor起動でしか確認しておりません…。
何でこんなことしてるの?
UnityのFrameDebugger最大の不満点は描画を1ステップずつずらしていかないと、描画に関する詳細の情報を取得できない事です。
ShaderやShaderKeyword、描画しているPass名等々が一覧で確認できません。
これは凄い不満だったので、今回作成しました。
特にShaderKeyword抜き出しは、ShaderVariantを抑えるためにも、この取得をさっくり出来るのは非常に重要なのですが、、、
現状では、相当設計して作成していない限り、一覧で持ってくるのは非常に困難です。
ハマった事
FrameDebuggerは、どのステップにいるかを指定してあげないと、その時の詳細情報が取れない仕様になっています。
最初は FrameDebuggerUtility という便利なクラスを見つけて、こちら経由で操作していました。
※InternalクラスなのでReflectionの嵐です。
失敗した実装
1.FrameDebuggerUtility.SetEnable で有効に
2.FrameDebuggerUtility.countでフレーム数取得
3.FrameDebuggerUtility.limitの値を書き換える
4.FrameDebuggerUtility.GetFrameEventDataでそのフレームのデータを取得して書き出して、またFrameDebuggerUtility.limitを書き換えて次のフレームへ行く
と言った形の実装です。
こちらでは Editorアプリ上で再生していないときは上手くいっていたかのように見えました…。
ただEditor上で再生したときに走らせると「FrameDebuggerUtility.SetEnable(true)」で有効にした直後に、FrameDebuggerUtility.SetEnable(false)が呼び出されて即座に失敗しました…。
原因は表示していなくてもFrameDebuggerのWindow自体が処理を持ってしまっていたからでした…
現在の実装
仕方ないので、FrameDebuggerWindowを呼び出して何とかする方向にしました。
※これもまたReflectionの嵐…
1.FrameDebuggerWindow.ShowFrameDebuggerWindow()でウィンドウを呼び出す。
2.FrameDebuggerWindow.EnableIfNeededでFrameDebugger起動
3.FrameDebuggerWindow.ChangeFrameEventLimitでフレームずらす
4.FrameDebuggerUtility.GetFrameEventDataでそのフレームのデータを取得して書き出して、またFrameDebuggerWindow.ChangeFrameEventLimitを書き換えて次のフレームへ行く
という感じで、操作はFrameDebuggerWindowから行い、データはFrameDebuggerUtility から取得するという形です
そんなこんなで、FrameDebuggerの中身を文字列に書き出すことに成功しました!!
追記
こんな感じでCSV書き出しをするようにしました。わりとやりたい事出来た感じあるー。
— 黒河優介(YusukeKurokawa) (@wotakuro) December 24, 2019
というか、RenderTargetの情報も抜き出せて便利だなぁー pic.twitter.com/6gmRcPoqQk