NKRO (N-key Rollover) というのは、おおざっぱに言うとキーボードのキーを同時押ししたとき、いくつ認識するか?ということです。
NKRO の理想的には以下の挙動になります。
- いくつキーを押しても全て同時に押されていることがコンピュータから認識される
これを NKRO として定義すると、全ての USB HID キーボードは NKRO ではありません。なぜなら、USB HID キーボードは修飾キーを除くと6キーまでしか押されていることを送信できないからです。
USB HID での NKRO
そうすると妥協した次点として以下のような仕様を NKRO とするほかありません。
- 6キーまでは同時押しがコンピュータから認識される
- 7キー目を押すと、最初に押したキーが離されたと認識される
完全な同時押しは6キーまでですが、入力をとりこぼすということはありません。USB HID で NKRO と呼ばれているものはおそらくこの挙動をすると思います。
まぁ実際のユースケースとして、そもそも7キー以上の同時押しは極めて稀です。ということでさらに妥協して以下のような実装も考えられます
- 6キーまでは同時押しがコンピュータから認識される
- 7キー目を押しても無視される
これはこれでほとんど問題ないでしょう。単純に 6KRO になります。押した順番という状態を持つ必要が減るのでファームウェアの実装は簡単になります (バグを少なくできます)。一方で、キーを離さないクセを持つ人がものすごい高速タイピングをした場合にはキーをとりこぼすかもしれません。
PS-2 キーボードではどうなのか?
PS-2 キーボードのプロトコルは単純で、シリアル通信で
- キーを押すと Make 信号を発生させる
- キーを離すと Break 信号を発生させる
というものです。つまり NKRO になるかはOS側の実装次第です。
ゲーマー向けのマザーボードには PS-2 端子がついていることが多いですが、これは
- NKRO 対応のため
- レイテンシ削減のため
であると思われます。USB はホストからのポーリングで成りたっているため、キーを押した瞬間にコンピュータにデータが送られてくるわけではなく、コンピュータ側からのポーリングを待つ必要があります。ポーリング間隔はデバイス側から通知され、最小で1msまで設定可能ですが、OS 側に最終決定権があり、例えば Windows では最小で 8ms (Low Speed) , 1ms (Full Speed), 0.125ms (High Speed) です。つまりこの時点で最大で0.125msの遅延が発生します。
PS-2 の場合、キーが押された瞬間に Make 信号を送るため、理論的にはこちらのほうが早いことになります。