レポート、ツール、エージェント
profiler.report() は、バッファ内のフレーム(デフォルトで 10 秒分)についてのプレーンな JSON を返します。次の例は、165 Hz のディスプレイで動かした debuff のゲームのものです。
json
{
"frames": 558,
"seconds": 3.47,
"fps": 160.88,
"budgetMs": 9.09,
"displayIntervalMs": 6.06,
"intervalMs": { "p50": 6.1, "p95": 6.2, "p99": 12.1, "max": 30.3 },
"cpuMs": { "p50": 0.2, "p95": 0.6, "max": 1.4 },
"hitches": 3,
"causes": { "unknown": 2, "script": 1 },
"worst": [],
"spans": { "update": 0.04, "render": 0.09 },
"perFrame": { "draws": 1, "uploads": 1, "uploadBytes": 0 },
"overheadMs": 0.053,
"support": { "attribution": true, "heap": true, "contexts": true },
"warnings": []
}intervalMsはプレイヤーが感じる時間です。平均ではなく p95 と p99 を見てください。cpuMsはフレームのコードにかかったコストです。worstには判定が遅い順に最大 10 件入ります。supportはこのブラウザが何を報告できるかを示します。原因をどこまで信用できるかの目安になります。warningsは Myaku に見えなかったものを示します。静かなレポートを信じる前に、必ず確認してください。
警告
Myaku は、保証できない健康そうなグラフを見せるくらいなら「見えていません」と正直に伝えます。profiler.warnings()、レポートの warnings、オーバーレイのどれにも、次の内容が並びます。
- フレームが記録されていない。 ゲームが Myaku の読み込み前の
requestAnimationFrameへの参照を持ち続けています。Myaku を最初に読み込んでください。 - canvas コンテキストが見えない。 Myaku の読み込み前にゲームがコンテキストを作ったため、描画、アップロード、コンパイルが数えられていません。Myaku を最初に読み込んでください。
- スパン名が 16 個を超えた。 残りは捨てられず、
otherとして合計されます。 - ヒープが粗すぎる。 ブラウザによってはヒープの報告がまれだったり刻みが大きかったりして、ガベージコレクションが見えません。Myaku は読み取り値が実際に変化するかを確かめます。変化しなければ
support.heapはfalseになり、unknownの判定には GC の可能性を否定できないと書かれます。
ブラウザ自動化から
Myaku は window.__MYAKU__ として公開されているので、Playwright や Puppeteer で遊んだあとに読み取れます。
ts
await page.goto("http://localhost:5173");
await page.waitForTimeout(5000);
const report = await page.evaluate(() => window.__MYAKU__.report());
expect(report.intervalMs.p95).toBeLessThan(20);コーディングエージェントから
debuff のプロジェクトでは、MCP サーバーの game_profile ツールが動いているゲームのレポートを返します。explain-stutter プロンプトは、その読み方をエージェントに案内します。最悪の判定を読んで、指し示されたコードを開き、直してから、もう一度計測するという流れです。