ブラウザゲームの入力は何ミリ秒で画面に反映されるか

pointerdown・keydown のイベントが発生してから、次のアニメーションフレームでスクリプトが処理できるまで、何ミリ秒か。『60秒後の彼女』のコードで Chromium に計らせました。

結論: 測定環境(Chromium 149 / Windows / フォアグラウンド)では、ポインタ入力の中央値は約 2〜4 ms、キーボード入力は約 0.6〜0.8 ms でした。ただしこれは「この環境での値」であり、端末一般の入力遅延ではありません。また p90 は 12〜14 ms に跳ね上がるため、個々の操作の体感はフレームタイミングに引っ張られます。

1. 何を測ったか

入力イベントの timeStamp仕様 WHATWG HTML / W3C UI Events)から、その直後の requestAnimationFrame コールバックが動くまでの経過を performance.now()仕様 WHATWG High Resolution Time)で測りました。GPU への実描画完了ではなく「次フレームでスクリプトが観測できるまで」の proxy です。

2. 測定コード(抜粋)

const rec = (kind, evtTs) => {
  const t0 = evtTs;
  requestAnimationFrame(() => {
    const t1 = performance.now();
    window.__lat[kind].push(t1 - t0);
  });
};
window.addEventListener('pointerdown', (e) => rec('pointer', e.timeStamp), true);
window.addEventListener('keydown', (e) => {
  if (e.key === ' ' || e.key === 'Enter') rec('keyboard', e.timeStamp);
}, true);

各入力を 60 回ずつ発行し、中央値・p90・最大値を算出。外れ値は除外せず件数のみ表示。

3. 結果(この環境での値)

表1:入力遅延の実測(n=60、Chromium 149 / Windows)
入力最小中央値p90最大平均
pointerdown0.3 ms約 2〜4 ms約 13.5 ms32.2 ms4.8 ms
keydown (Space)0.2 ms約 0.6〜0.8 ms約 11.6 ms19.7 ms3.5 ms

生データは リポジトリの reports/input-latency.json にあります。数値は実行ごとに変動します。

4. ポインタとキーボード

中央値はキーボードのほうがわずかに短い傾向でしたが、いずれも 1 フレーム(60Hz で約 16.7 ms)以内です。したがって本作のような「次のフレームで反映されれば良い」操作では、入力手段による差は体感に乗りにくい設計になっています。とはいえ、p90・最大値が 10〜30 ms に達するのは、他のスクリプト処理やガベージコレクションとの競合と考えられ、毎フレーム重い処理を積むと遅延が目立ちます。

5. フレーム境界と 60Hz / 120Hz

リフレッシュレートが 60Hz(約 16.7 ms/フレーム)の場合、入力がフレームの終わり近くに届くと次フレームまで最大約 16.7 ms 待ちます。120Hz(約 8.3 ms/フレーム)なら待ち時間の上限が半分になります。本作は performance.now() ベースの deadline タイマーで計時しているため、フレームレートに関わらず同じ実时刻で終了します(タイマー記事参照)。

6. 実装への反映

入力ハンドラは e.preventDefault() を適切に効かせ、イベントリスナは capture phase で登録し、フレーム内の重い同期処理を避ける方針です。これにより、測定した遅延を実用上問題ない範囲に保っています。

7. 読者向けチェックリスト

8. 制限(limitations)

出典

▶ 60秒後の彼女をプレイするタップ領域の実測へ方法論へ