ErgoDox EZの入力遅延がMacBookの
性能ではなくDebounce delayだった

MacBook Air 2018 で ErgoDox EZ を使っています。
文章を書いていると、反応が遅く指と画面のズレが気になります。

ただ、MacBookには外付けディスプレイにつないだり、いくつもウィンドウを表示させたりしているので、インプットメソッドに負荷がかかっているのだと思っていました。

しかし、違和感を覚えたのは「内蔵キーボードだとスムーズに入力できる」ということ。
どうも、変換する前のキー入力段階に違いがあるようなのです。

関連記事

1. 入力遅延とポーリングレートと Debounce

Mac の内蔵キーボードは、本体内部に直接つながっています。
一方、ErgoDox EZ は USB 接続の外付けキーボードです。
入力は USB を通り、OS に届いてから処理されます。
この経路の違いが遅延の原因になっている可能性があります。

とはいえ、一般的な USB キーボードで明確な遅延を感じることはあまりありません。
どこかに設定上のボトルネックがあると考えました。
とくに、ErgoDox EZ は内部にチップがあり、いろんな設定を変更できるからです。

調べていくと、二つのキーワードに行き着きました。
ポーリングレートと Debounce です。

ポーリングレートは、キーボードが「今キーが押されていますか」とパソコンに報告する頻度です。
1秒間に何回報告するかを Hz で表します。
数値が大きいほど、理論上は反応が速くなります。

Debounce は、キーを押したときのブレを防ぐ仕組みです。
物理的なスイッチは、押した瞬間に微細な振動が起きます。
その結果、1回しか押していないのに複数回押されたように見えることがあります(チャタリング)。
それを防ぐために、「本当に押されたか」を一定時間待ってから確定させる、この待ち時間が Debounce delay です。

ただし、この「待ち時間」が長いと、入力が遅くなります。

2. Oryx の設定でDebounce delay が 12ms だった

ErgoDox EZ は Oryx という公式ツールで設定します。

ポーリングレートは、デフォルトでした。
Troubleshoot USB polling rate がオンはキーボードに不具合があるときに使い、ポーリングレートが下げます。

2. Oryx の設定でDebounce delay が 12ms だった

Advanced Configuration Settings を開き、Debounce delay の項目を確認しました。
そこに表示されていたのは 12ms です。

2. Oryx の設定でDebounce delay が 12ms だった

12ms と聞くと短く感じますが、これは「必ず 12ms 待つ」という意味です。
1打ごとに確実に加算されるので、人間が遅延として感じ始める境界に近い値です。

「これが原因ではないか」と考え、 3ms に設定し、ファームウェアをビルドして書き込みます。

2. Oryx の設定でDebounce delay が 12ms だった

書き込んでキーを押すと、これまで無意識に感じていた「一瞬待たされる感じ」がなくなりました。
内蔵キーボードと比べて、遅いと感じる場面はありません。

しばらく使っていますが、チャタリング(勝手に連打される症状)は今のところ出ていません。
スイッチや個体差によっては問題が出る可能性はありますが、少なくとも私の環境では安定しています。

3. Lacailleの同時打鍵判定

ところが、その直後から別の違和感が出てきました。
親指シフト入力で、同時打鍵がうまく決まらない場面が増えたのです。
意図した通りに押しているつもりなのに、単打として扱われたり、逆に誤ってシフト扱いされたりします。

Debounce を小さくすると、入力確定までの待ち時間が短くなります。
その結果、1打ごとの反応は確実に速くなります。

一方で、キーごとの微妙な差や押し方の癖が、そのまま時間差として表に出やすくなります。

3.1. 同時打鍵判定時間の意味

Lacaille は、親指シフト入力を macOS 上で実現するためのソフトです。
この方式では、文字キーと親指キーを「同時に押した」と判断できるかどうかが重要になります。

その判断に使われるのが、同時打鍵判定時間です。
二つのキーが、どれくらいの時間差までなら「同時」と見なすかをミリ秒で指定します。

Debounce を 3ms に下げた状態で、同時打鍵判定時間を 85ms のまま使っていました。
この設定では、速く打とうとしたときに、同時打鍵が外れることがありました。

3.1. 同時打鍵判定時間の意味

自分では同時に押しているつもりでも、実際にはキーイベントの到達時刻に差が出ていたようです。

原因が時間差にあると考え、Lacaille の同時打鍵判定時間を 85ms から 115ms に広げました。Debounce を下げた分、同時と見なす許容範囲を広げる、という考え方です。

設定変更後、同時打鍵は明らかに安定しました。速く入力しても、意図した通りに親指シフトが成立します。Debounce を下げて得た速度感を、そのまま活かせるようになりました。

3.2. 処理の流れで考える

キー入力は、次の順で処理されます。

物理キーを押す。QMK が Debounce 後に入力を確定する。
macOS にキーイベントが届く。
Lacaille がその時間差を見て同時打鍵かどうか判断する。

Debounce はキーごとに独立して働きます。
そのため、左右の指や押し方の違いで、確定時刻に数ミリ秒から十数ミリ秒の差が出ます。

Debounce を下げると、この差が隠れなくなります。
その結果、同時打鍵判定の条件が厳しく感じられるようになります。

同時打鍵判定時間を広げすぎると、別の問題が出ます。単打のつもりが同時打鍵として扱われる可能性が高くなります。

今回の 115ms は、私の入力リズムでは問題ありませんでしたが、誰にとっても最適とは限りません。Debounce と同時打鍵判定は、速さと安定性のバランスで決まります。

4. おわりに:設定は組み合わせで効いてくる

Debounce を下げれば万能、というわけではありません。スイッチの状態が悪い場合や、長期間使った個体ではチャタリングが起きる可能性があります。その場合は値を戻す必要があります。

今回分かったのは、QMK の Debounce と Lacaille の同時打鍵判定は、別々の設定でありながら、時間軸では強く関係しているという点です。

Debounce を下げて入力を速くすると、その分だけ同時打鍵側の許容を見直す必要がありました。単独では正しい設定でも、組み合わせると不安定になることがあります。