0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

QMKキーボードはゲームに使えるのか?

0
Posted at

QMKキーボードはゲームで使えるのか?――ソースコードから読み解く遅延の真実

結論:普通に使える

結論から言う。QMKキーボードはゲームで問題なく使える。

「自作キーボードは遅延があるからゲームには向かない」という声を見かけることがあるが、これは誤解である。QMKファームウェアのキー入力遅延は約5〜8msであり、これは市販のゲーミングメカニカルキーボードと同等か、むしろ優秀な部類に入る。

ここで冷静に数字を見てほしい。144Hzモニターの1フレームは約6.9msである。つまりQMKの遅延はたった1〜2フレーム分に過ぎない。しかもこの1〜2フレームの差は、他のあらゆる遅延要因に埋もれてしまう程度のものである。

FPSゲームを例に考えてみよう。オンライン対戦ではサーバーとの通信遅延(ping)が常に存在する。国内サーバーでも10〜30ms、海外サーバーなら50〜100msは当たり前である。キーボードの5msの差を気にするよりも、回線環境を改善したほうが遥かに効果的だ。

もし「1msでも遅延を削りたい、0.1mmの押下で反応してほしい」というレベルを目指すのであれば、それはもうメカニカルスイッチの限界を超えた話である。その領域を求めるならば、ラピッドトリガー対応の磁気式(ホールエフェクト)キーボードを選ぶべきだ。物理接点を使うメカニカルスイッチである以上、QMKだろうが市販品だろうが、チャタリングとデバウンス処理からは逃れられない。


QMKキーボードはどうやって動いているのか

では、QMKキーボードの内部で何が起きているのかを、実際のソースコードを追いながら解説する。キーを押してからPCに届くまで、データは5つのステージを通過する。

ステージ1:マトリックススキャン(キーの物理的な読み取り)

キーボードの内部では、キースイッチが行(Row)と列(Column)の格子状に配線されている。例えば60キーのキーボードなら、5行×14列のマトリックスとして構成されていることが多い。

MCU(マイクロコントローラー)は、行のピンを1本ずつ順番に通電し、その時に列のピンの電圧を読み取る。「5行目を通電したとき、3列目のピンに電圧が来ている」と検出されたら、その交差点にあるキー、つまり5行3列のキーが押されていると判断できる。

QMKのソースコード quantum/matrix.c では、これが以下のように実装されている。

行を選択(ピンをLOWに駆動)
  ↓
列のピンを全て読み取り
  ↓
行の選択を解除
  ↓
次の行へ(全行を繰り返す)

1回のスキャンにかかる時間は、行ごとに約30μs(マイクロ秒)の待機時間が設定されている。5行のキーボードなら約150μs、つまり0.15msで全キーの状態を把握できる。ARM系のMCUを使った場合、1秒間に数千〜1万回以上このスキャンを繰り返している。

これは人間がキーを押す速度(どんなに速くても50ms以上はかかる)に対して桁違いに速い。スキャンの取りこぼしが起きる心配は全くない。

ステージ2:デバウンス(チャタリング除去)

ここがQMKの遅延の最大の要因であり、同時に最も重要な処理である。

メカニカルスイッチは金属の物理接点でON/OFFを切り替えている。接点が触れる瞬間、微視的に見ると金属同士がバウンドして、数ミリ秒の間に「ON→OFF→ON→OFF→ON...」と高速に振動する。これがチャタリングと呼ばれる現象だ。

もしデバウンス処理がなければ、キーを1回押しただけで「aaaaaaa」のように何文字も入力されてしまう。そこでQMKはデフォルトのデバウンスアルゴリズム sym_defer_g(symmetric defer global)を使い、状態が安定してから5ms経過するまで入力を確定しないという処理を行っている。

quantum/debounce/sym_defer_g.c の動作を簡単に説明するとこうなる。

1. スキャンでキーの状態が変化した → タイマー開始
2. また変化した(チャタリング中)→ タイマーリセット
3. 変化しなくなった → タイマー継続
4. 5ms経過 → 入力確定!

「変化しなくなってから5ms」待つことで、チャタリングが完全に収束した後にだけ入力を受け付ける仕組みである。この5msが遅延の大部分を占める。

ここで重要なのは、これはQMK固有の問題ではないということだ。物理接点を持つメカニカルスイッチを使う全てのキーボードは、何らかのデバウンス処理を行っている。市販のゲーミングキーボードも、ファームウェア内部で同様の処理を行っているのだ。むしろQMKはデバウンス時間を自由に変更できる分、市販品よりも柔軟である。

ステージ3:キーコード変換とアクション実行

デバウンスを通過して入力が確定すると、マトリックスの座標(何行何列のキーが押されたか)を実際のキーコードに変換する処理が走る。

quantum/keymap_common.c がこの変換を担っている。ユーザーが定義したキーマップ(例:2行3列のキーは「A」)を参照し、対応するキーコードを取得する。さらに quantum/action.c がそのキーコードに基づいてレポートバッファにキー情報を書き込む。

この処理は純粋なCPU演算であり、数十マイクロ秒で完了する。遅延への寄与はほぼ無視できるレベルである。

ステージ4:USBレポート送信

quantum/action_util.csend_keyboard_report() がレポート送信の最終段階を担う。ここで注目すべきは、前回と同じ内容のレポートは送信しないという最適化が入っていることだ。

// action_util.c より(概要)
if (memcmp(keyboard_report, &last_report, ...) != 0) {
    memcpy(&last_report, keyboard_report, ...);
    host_keyboard_send(keyboard_report);  // 変化がある時だけ送信
}

USBのポーリングレートはデフォルトで1000Hz(1ms間隔)に設定されている(tmk_core/protocol/usb_descriptor.c で定義)。レポートが準備できてから、次のUSBポーリングタイミングまで最大1ms待つことになる。平均すれば約0.5msの待ちである。

ステージ5:PCでの受信と処理

USBホスト(PC)がレポートを受信し、OS(オペレーティングシステム)のHIDドライバーが処理して、アプリケーション(ゲーム)に入力が届く。この段階はキーボード側の話ではないが、通常0.5〜2ms程度である。

遅延の合計

全ステージを合計すると、以下のようになる。

ステージ 所要時間
マトリックススキャン待ち 0.25〜1ms
デバウンス 5ms
キーコード変換・アクション処理 0.05ms
USBポーリング待ち 0〜1ms(平均0.5ms)
USB転送 0.1ms
合計 約5.9〜7ms

市販のゲーミングキーボードの遅延は、各種レビューサイトの計測によると5〜15ms程度が一般的である。QMKの6〜7msは、市販品と比較しても十分に競争力のある数値だ。


人間の知覚と反応速度から考える

人間が知覚できる遅延の限界

そもそも、人間はどの程度の遅延を知覚できるのだろうか。

研究によると、人間が「遅延がある」と感覚的に認識できる閾値は、視覚フィードバックを伴う場合で約20〜30msとされている。つまり、QMKの5〜8msの遅延は、仮に0msのキーボードと比較したとしても、人間の感覚では区別できない領域にある。

10msの差を体感で判別できると主張する人もいるが、ブラインドテスト(どちらのキーボードか分からない状態でのテスト)で一貫して判別できるかというと、ほぼ不可能であるという実験結果が出ている。

FPSにおけるキーボード遅延の寄与率

FPSゲームにおいて「反応速度」に関わる遅延要因は、キーボードだけではない。全体を俯瞰してみよう。

遅延要因 典型的な遅延
人間の反応速度 150〜250ms
モニターの表示遅延 3〜15ms
GPU描画パイプライン 10〜30ms
ネットワーク遅延(ping) 10〜100ms
OS・ドライバー処理 1〜3ms
キーボード遅延 5〜15ms

人間の反応速度は、訓練されたプロゲーマーでも150ms程度である。一般的なプレイヤーなら200〜250msが平均だ。この150〜250msの中で、キーボードの遅延が占める割合はわずか3〜5%に過ぎない。

さらに実戦的な状況を考えてみよう。FPSで敵を発見してから撃つまでの流れを時間で分解する。

敵を視認
 ↓
脳が認識(50ms)
 ↓
判断(50ms)
 ↓
筋肉への指令(50ms)
 ↓
指が動く(30ms)
 ↓
キーボード遅延(7ms)
 ↓
PC処理(5ms)
 ↓
ネットワーク(20ms)
 ↓
サーバー処理(10ms)

合計約222msのうち、キーボード遅延はたったの7msである。仮にキーボードの遅延が0msになったとしても、合計は215msにしかならない。**差はわずか3%**だ。この3%の差で勝敗が決まるような状況は、年に何回あるだろうか。

それよりも、正確なエイムの練習をする、マップの理解を深める、立ち回りを改善するほうが、勝率への貢献は圧倒的に大きい。

pingとの比較

オンラインFPSにおいて、ネットワーク遅延(ping)の影響はキーボードの遅延よりも大きい。

ping 20msの環境からping 50msの環境に変わったとする。この30msの差は、キーボードの遅延差の数倍である。しかも通信遅延は往復で影響するため、実質的にはさらに大きな差になる。

キーボードの数msを気にする時間があるなら、有線LAN接続にする、ルーターを買い替える、サーバーの近いリージョンを選ぶといった対策を取るほうが、はるかに合理的である。


自作キーボードを作ろう

ここまで読んで、QMKキーボードがゲームに使えることは理解していただけたと思う。では最後に伝えたいことがある。

自作キーボードを作ろう。

自作キーボードの本当の価値は、遅延の数値にはない。自分の手に完璧にフィットするキーボードを、自分で設計し、自分で組み立てられることにある。

  • キーの数、配列、角度を全て自分で決められる
  • WASDの位置を自分の手のサイズに最適化できる
  • ゲーム用のレイヤーを作り、左手だけで全操作を完結させることもできる
  • スイッチの種類、打鍵感、反応力を1キーずつ変えることすら可能
  • QMKのファームウェアは完全にオープンソースであり、コードを読み、理解し、自分で改変できる

市販のキーボードは万人にそこそこ合うが、あなた専用ではない。
自作キーボードは、あなただけのために存在する入力デバイスだ。

ソースコードを読んでわかったように、QMKの内部構造は合理的に設計されており、遅延も最小限に抑えられている。ゲームに使えないなどということは全くない。安心して、自分だけのキーボードを作ってほしい。

さあ、今すぐ自作キーボードを作ろう!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?