AI にゲームを作らせていると、必ずこの質問になります。「これ、重くない?」
人なら Profiler を開いて見ます。AI は画面を見られません。では何を読ませるか。3つ使いました。
- 1
エディターから数字で取る
Unity CLI のget_performance_stats。描画の呼び出し数・メモリ・フレーム時間が JSON で返る - 2
コードの中で測る
同じ処理を60回くり返してStopwatchとGC.GetTotalMemory。内訳がいちばんはっきりする - 3
本番のブラウザで確かめる
自動で開いて fps と最長フレームを数える。最後はここで確かめる
1. エディターから数字で取る
実行中のエディターに問い合わせると、こういう JSON が返ります。
unity command get_performance_stats --result-only
{
"render": { "drawCalls": 360, "batches": 0, "setPassCalls": 5, "triangles": 807, "vertices": 1611 },
"memory": { "totalAllocatedBytes": 972184639, "monoUsedBytes": 116084736 },
"frameTiming": { "available": true, "cpuFrameTimeMs": 3.66, "gpuFrameTimeMs": 0.51,
"cpuMainThreadFrameTimeMs": 1.75 }
}これを、同じ場面のまま書き方だけ切り替えて取り直します。4本目のゲームで、絵を使い回す/毎フレーム作って壊す、を切り替えた結果がこれです。
毎フレーム作って壊す
- 描画の呼び出し 418
- CPU のフレーム時間 14.04ms
- メインスレッド 8.12ms
作ったものを使い回す
- 描画の呼び出し 360
- CPU のフレーム時間 3.66ms
- メインスレッド 1.75ms
出している絵はまったく同じなのに、時間は約4倍違います。AI はこの2つの JSON を比べるだけで「どちらが重いか」を判断できます。
エディターの数字は本番より重い
エディター上の計測には、エディター自身の負担が混ざります。大小の比較には使えますが、そのまま「本番で何 ms」とは言えません。 最後は本番で確かめます。
2. コードの中で測る(内訳がいちばんはっきりする)
もっと細かく知りたいときは、比べたい処理だけを60回くり返して測ります。
System.Action<bool> measure = (usePool) =>
{
view.UsePool = usePool;
view.Render(b); // 1回描いて温める
GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();
long mem0 = GC.GetTotalMemory(true);
var sw = System.Diagnostics.Stopwatch.StartNew();
for (int i = 0; i < 60; i++) view.Render(b);
sw.Stop();
long mem1 = GC.GetTotalMemory(false);
Log($"{sw.Elapsed.TotalMilliseconds / 60:0.00}ms / 確保 {mem1 - mem0}バイト");
};
画面にあるもの:敵60 自機の弾300 合計361個 プールあり: 60回 9.0ms(1回 0.15ms)確保 0バイト プールなし: 60回 1143.8ms(1回 19.06ms)確保 1904640バイト プールあり: 60回 8.8ms(1回 0.15ms)確保 0バイト
最後にもう一度「プールあり」を測っているのがポイントです。同じ数字に戻れば、途中で機械の状態が変わっていないと分かります。
3. 本番のブラウザで確かめる
最後は本番です。スマホの見た目で開き、はじめて、10秒数えます。
node scripts/measure-play.mjs "https://aigame.game-union-libra.com/play/mureuchi/" 25
{"url":"https://aigame.game-union-libra.com/play/mureuchi/","fps":60.1,"worstMs":16.9,"frames":601}ここで大事なことが1つあります。
⚠️ ブラウザの fps は 60 で頭打ち
描画は画面の更新に合わせて呼ばれるので、余裕があってもなくても 60 前後になります。私は最初これで「差が無い」と判断しかけました。余裕を知りたいなら最長フレーム(worstMs)を見るか、上の2つの方法で1回あたりの時間を測ってください。
使い分け
内訳を知りたい
本当に大丈夫か知りたい
AI に渡す手順にしておく
毎回同じことを頼まなくていいように、手順そのものをリポジトリに置いています。
重さを判断するときの決まりごと
まとめ
- Profiler の画面は AI に読めない。同じ情報の一部は CLI で数字として取れる
- 同じ場面で切り替えて比べれば、描画の呼び出し 418→360・CPU 14.04ms→3.66ms のように差が出る
- ブラウザの fps は 60 で頭打ち。最長フレームか、コードの中の実測を見る
- 手順を決めて置いておけば、毎回同じやり方で測れる