簡単なデバッグ用スクリーンインジケータを作りました。
ゲーム開発でよく見る奴です。
車輪の再発明というか、標準の Profiler でよくね?と思いますが、私もだいたい同意です。

- 上の白い四角がTargetFPSの範囲になります。グラフがはみ出すのは処理が間に合っていないときです。
- 赤がRender、グレーは1フレームの時間です。Editor 上のスクリーンショットなので TargetFPS とグレーが一致していませんね。
Physics, Update, LateUpdate, Animation 等の処理別に処理時間を計測していますが、Render 以外は目立ちません。
- 下が過去60フレームの1フレームの処理時間/1フレームの時間のグラフです。
- GCがあったフレームはグラフ上で赤/黄で目立つように表現されます。
特徴
- リリースビルドでも動く(むしろ、止めたければどうにかいじってください)
- 動的なメモリ割り当て無し(例外あり、後述)
- スクリーンに描画を行うので、実機で確認可能
動的なメモリ割り当てなし
プロファイル、描画等で動的なメモリ割り当ては行なっていません。固定バッファでやりくりしています。
例外は、 yield WaitForEndOfFrame を行なっている部分で、Unity側の MoveNext () で毎フレーム16byte確保されます。
誰か防ぐ方法教えてください。
RayString
低機能なStringモドキです。使い方は例を見ればわかると思います。
var r = new RayString(100);
r.AddStr ("Foo").AddInt (10).AddStr ("Bar").AddFloat (0.5f, 0, 1);
Assert.AreEqual(r.ToString (), "Foo10Bar0.5");
上の例では、ToString ()でnew stringされていますが、char[] Bufferを参照することで動的メモリ割り当て無しで中身が取り出せます。
実装上の都合で(floatの内部表現が面倒なので)、AddFloat の精度は低いです。float の持つ精度を超える小数部の桁数を指定した場合、
C# のライブラリでは0でフィルされますが、このAPIでは精度以上の部分はゴミが入ります。
バッファが溢れそうなときは拡張を行うので、このときは動的メモリ割り当てを行います。
RayCanvas
デバッグ用簡易Canvasです。文字列と矩形しか表示しません。
Mesh 用のデータを静的に持っておくことで、動的割り当てを回避する実装になっています。
データサイズは静的になりますが、表示内容が少なくても多くてもメモリ消費も描画コストもかかります。
参照
パッケージとソースはgithubにあります。
Unity5.3, 5.4, 5.5. 5,6でパッケージを作りましたが(疲れました)、ソースは同一です。サンプルprefabをそれぞれのバージョンで生成しただけです。