ゲームでキー入力が遅れて感じる理由

スイッチが閉じてからゲームが反応するまでの遅延は 6 つの段階からなり、そのうちソフトウェアの段階は 2 つだけです。どれを短くでき、どれを短くできないか、そしてご自分のマシンでそれらを見分ける方法を説明します。

指からゲームまでの遅延の大部分は、Windows ではなくキーボードの中にあります。キー入力はピクセルが変わるまでに 6 つの段階を通り、ソフトウェアが短くできるのはそのうちちょうど 2 つです。キーボードの遅延をなくすレジストリ値を探してここに来たのなら、正直な答えは、そのような値は存在しないということです。ただし、6 つの段階のうち 3 つには実際に確認できる不具合があり、それには 20 分をかける価値があります。

このページでは経路を分け、それぞれの部分を誰が担っているかを示し、手の届かない部分をはっきり伝えます。

キー入力が実際にたどる経路

段階担当ソフトウェアで短くできるか
1. スイッチが閉じ、キーボードのコントローラーがマトリクスをスキャンして接点のチャタリングを除去するキーボードのファームウェアいいえ
2. キーボードが、ファームウェアが要求した間隔で、USB の割り込みエンドポイントにレポートを用意するキーボードのファームウェアいいえ
3. ホスト コントローラーがレポートを受け取り、kbdhid.sys と kbdclass.sys が上へ渡すWindows + チップセット ドライバー処理を止めているドライバーを取り除くことでのみ
4. レポートが、入力経路にあるフィルター ドライバーや低レベル フックを通過するキーボード ユーティリティ、マクロ層、オーバーレイはい
5. ゲームが入力を読み取る。ほとんどのエンジンでは 1 フレームに 1 回ゲーム間接的に、フレーム レートを上げることで
6. フレームが描画、表示、走査出力され、発光するGPU、Windows、モニター一部: ソフトウェアでは直せない入力遅延を参照

段階 1: 誰も手を出せない部分

キーボードは、スイッチが閉じた瞬間に信号を送るわけではありません。キーボード自身のコントローラーがキー マトリクスを繰り返し走査し、接点を検出すると、バウンスが収まるのを待ってからキーが押されたと判断します。この待ち時間はファームウェアの定数です。Windows には公開されておらず、どのドライバーも読み取れず、お使いのマシンのどこにあるレジストリ値でも変えられません。

同じ PC で、ほかの条件がすべて同じなのに 2 つのキーボードの感触が違うことがあるのはこのためです。「キーボードの遅延」が、ソフトウェアの問題に見えて実はハードウェアの問題であることが多いのもこのためです。

段階 2: ポーリング間隔はキーボードが決め、明記している

入力を送る USB デバイスは割り込みエンドポイントを使い、エンドポイント記述子には、ホストがどのくらいの頻度で問い合わせるべきかを示す bInterval というフィールドがあります。この構造体についての Microsoft 自身のリファレンスは、はっきりこう書いています: 「この値は、ファームウェアでのデバイスの構成を反映しています。ドライバーはこれを変更できません。」

同じページに対応関係も示されています。フルスピード デバイスでは、bInterval が 1 なら、ポーリング周期は 1 ミリ秒のフレーム 1 つです。これがキーボードがうたう 1000 Hz という数値です。ハイスピード デバイスでは、周期は 1 ミリ秒あたり 8 つのマイクロフレームを単位として、Period = 2 ** (bInterval - 1) の式で数えられます。

ここから 2 つのことが言え、これがこのページで最も役に立つ文です:

一部のキーボードは、互換モード (多くは「boot protocol」と表示されるか、6 キー ロールオーバーのスイッチと結び付いています) で出荷されており、このモードではレポート レートも下がります。Windows が遅いと結論づける前に、キーボード自身の説明書か構成ソフトウェアを確認してください。

よく変更されるが、これには効かない 2 つの設定

どちらも、あらゆる「キーボードの遅延を直す」リストに載っています。どちらも押してからゲームまでの経路を短くはしません。プラセボを売るより、そうはっきり言うほうを私たちは選びます。

キーリピートの待ち時間と速度。 HKCU\Control Panel\Keyboard の下にある KeyboardDelay と KeyboardSpeed は、キーを押し続けたときの動作を決めます: 文字が繰り返し入力され始めるまでの時間と、その後に繰り返す速さです。最初の 1 回の入力にはまったく影響しません。w0a は待ち時間を最短の段階に設定でき、製品自身の説明に、それで得られるものが書かれています: 速くなるのはコンソール、チャット ボックス、メニューで、射撃ではありません。以前のツールがこれらを不自然な値にしたままなら、キーリピートの間隔と待ち時間カードが Windows の既定値に戻します。

キーボード データ キューのサイズ。 KeyboardDataQueueSize は、レポートを取り出すスレッドが一瞬止まったときに、クラス ドライバーが保持できるレポートの数を決めます。キューが大きいほど、停止中に失われるレポートが減ります。どのレポートも早く届くようにはならず、製品は脚注ではなく自身のインターフェイスでそう伝えています。入力キューで、その値が何で、どう元に戻すかを説明しています。

キューのサイズを上げると入力遅延が下がると書いているページがあっても、もう信じないだけの知識があるはずです。キューは取りこぼしを防ぐためのバッファーで、近道ではありません。

段階 4: 本当にご自分で扱える唯一の段階

普通のマシンで、実際に測定できるキーボードの遅延があるのはここです。そして、ほとんど誰も確認しない段階でもあります。

ゲームより先にキー入力を見たいものはすべて、入力経路に自分自身を組み込みます: マクロ エンジンを持つキーボード メーカーのユーティリティ、入力に反応するキーごとのライティングのデーモン、配信やチャットのオーバーレイ、画面録画ソフト、キー割り当てのユーティリティ、アクセシビリティ ツール。それぞれが中継点の 1 つで、忙しいか応答しない中継点は経路全体を止めてしまいます。

Windows には、まさにこの場合のためのタイムアウトがあります。低レベル フックが LowLevelHooksTimeout ミリ秒以内に応答しないと、Windows はそれを飛ばして先へ進みます。Windows 10 1709 以降は、値がどれだけ大きくても最大 1000 ms を使います。値が設定されていないときに Windows がどれだけ待つかは文書化されておらず、私たちも測定していません。w0a の「レジストリ調整」ページには、HKCU\Control Panel\Desktop の下に LowLevelHooksTimeout を書き込んで、この待ち時間を 1000 ms に設定する項目があります。

正直に読んでください: タイムアウトに上限を設けても、正常なフックが速くなるわけではありません。フックがすでにおかしくなっているときのフリーズを短くするだけです。それには価値がありますが、遅延の削減ではありません。

実際にすること (この順で):

  1. キーボード自身のソフトウェアを完全に終了します。トレイに最小化するのではありません。終了してから 1 ラウンドプレイします。
  2. オーバーレイを 1 つずつ閉じます: ゲーム プラットフォームのオーバーレイ、ボイス チャットのオーバーレイ、録画ソフト、GPU メーカーのオーバーレイ。
  3. 感触が変われば答えが見つかったので、どの機能にどの程度の遅延を払う価値があるかを決められます。
  4. 何も変わらなければ、ここを探すのはやめます。段階 3 に進みます。

段階 3: キーボードが必要とするコアを占有しているドライバー

キーボードのレポートは割り込みとして届きます。無関係なドライバーがそのプロセッサ コアを割り込みや遅延呼び出しの中で占有していると、キー入力は待たされます。しかも、システム内のどのスレッド優先度よりも上で待つため、どのフレーム時間のグラフにも、どのタスク マネージャーにも表れません。

これは測定でき、経路の中でご自分のマシンについて数値を出せる唯一の部分です:

  1. w0a で レイテンシ テスト を開きます。
  2. 開始を押し、12 秒間ずっとマウスを動かし続けます。テストはマウスのトラフィックを使って入力経路をサンプリングします。
  3. ドライバーによる最長の中断 の数値と、その下のドライバー一覧を読みます。一覧は占有時間の長い順に並び、ファイル名が示されます。
  4. 1 ms 以上のものはレポートを押しのけています。4 ms 以上のものは、何よりも先に直すべきものです。

コアを占有しているドライバーに対して最初に試す修正は、その特定のドライバーをハードウェア メーカーから入手して更新することです。レイテンシ テストの読み方では、色の意味と、より役に立つこととして、その数値が意図的に含めていないものを説明しています。

段階 5: ゲームは自分のタイミングで入力を読み取る

ほとんどのエンジンでは、ゲームは 1 フレームに 1 回入力をサンプリングします。60 FPS で動作するゲームは 16.7 ms ごとに、240 FPS なら 4.2 ms ごとにキーボードを見ます。これは計算であって測定ではなく、正確な入力のタイミングを公開しているエンジンはありません。そのため、タイトルごとの数値ではなく仕組みとして扱ってください。

実際の結果として、低いフレーム レートを上げるとこの段階の待ち時間は短くなり、40 FPS で足を引っ張っているのはキーボードではありません。フレーム レートが低いのではなく不安定な場合は、カクつき探偵が調べるもののページを参照してください。

残っていることと、その対処

「Fix」ページ: 変更される可能性があるものごとに修復カードが 1 つあり、それぞれが Windows の既定値に戻します。
「Fix」ページ: 変更される可能性があるものごとに修復カードが 1 つあり、それぞれが Windows の既定値に戻します。

短く、元に戻せるチェックリストです。どれも元に戻すことができ、下の手順のうち Fix カードを示すものは、どのツールが変更したかにかかわらず Windows の既定値を書き戻します。

  1. キーボードはマシン本体のポートに接続します。 モニターのハブ、電源のないハブ、KVM には接続しません。どれも、デバイスとホストの間にコントローラーをもう 1 つ挟むことになります。
  2. ポートが実際にどう動いているかを確認します。 w0a の USB ポート ページには、デバイスごとに、ファームウェアが要求したポーリング間隔と、実際の入力から測定したレポート レートが並んで表示されます。1 ms を要求しているのにそれよりはるかに少ないデバイスは、キーボードではなく接続かドライバーの問題です。
  3. 古い入力の調整を元に戻します。 以前のツールが変更していた場合、マウス、キーボード、タッチパッドと入力キューが Windows の既定値に戻します。
  4. USB の電源管理がポートをスリープさせないようにします。 しばらく操作しなかった後の最初の入力でキーボードが遅い場合です。そのためのカードが USB ポートの電源設定です。
  5. 測定してから判断します。 変更のたびに、その前後でレイテンシ テストを行います。測定で違いが見えない変更は、元に戻すべき変更です。

ここでソフトウェアにできないこと

ソフトウェアにできるのは、止まったフックを取り除き、コアを占有しているドライバーを明らかにし、ポートがスリープするのを止めることです。正常なマシンでは、それらを合わせても期待されるほどにはなりません。不調なマシンでは、それがすべての違いになります。どちらのマシンなのかは、測定して確かめるしかありません。

関連記事

クリックから画面のピクセルが変わるまでの十数段階のうち、ソフトウェアが受け持つのは 3 つだけで、残りはファームウェア、ディスプレイ、ゲームが受け持ちます: 入力遅延を減らす方法: ソフトウェアで短縮できるもの、できないもの

w0a は、指示されるまで Windows の設定を変更しません。また調整は、新しい値を書き込む前に元の値を保存します。 通知を受け取る

このページは役に立ちましたか?

何が足りなかったか、何がうまくいかなかったかを教えてください。いただいた内容はすべて読んでいます。

送信されるのは、入力した内容とこのページの名前だけです。サーバーは不正利用を防ぐために接続元の IP アドレスも記録し、報告と一緒に削除します。16 歳未満の方は、この欄を使わないでください。 プライバシー ポリシー

このページで解決しなかった場合は、ご連絡ください。どの記事を読んだかを書いていただければ、その記事を修正します。