本文へスキップ

レポート、ツール、エージェント ​

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 プロンプトは、その読み方をエージェントに案内します。最悪の判定を読んで、指し示されたコードを開き、直してから、もう一度計測するという流れです。