键盘延迟:延迟从哪来,又是怎样测出来的
键盘延迟是从手指开始按下按键,到键盘把这次按键发送给电脑之间的时间。它在四个环节中累积:按键行程、键盘扫描按键、防抖和 USB 轮询。没有任何网站能测出键盘延迟,因为浏览器要等键盘发出按键之后才会得知。评测者用电磁铁按下按键,再用 USB 分析仪记录这次按键离开键盘的时间。要降低键盘延迟,可以使用更短的触发键程、最高的回报率,以及不会让按键重复输入的最低防抖设置。
一次按键在电脑收到之前要在哪里等待
- 按键行程按键向下移动到开关触发的位置
- 扫描键盘芯片逐行检查按键网格
- 防抖等开关触点停止弹跳,或者忽略弹跳
- USB 轮询按键要等到电脑下一次向键盘询问新输入
合起来:键盘延迟
网页只能从这里开始计时
电脑和屏幕 游戏使用这次按键并绘制一帧,屏幕再显示出来:这是输入延迟的其余部分
延迟从哪来
- 按键行程。按键到达触发点之前,什么都不会发生。用每秒 240 帧拍摄时,一次正常按键要 4 到 8 帧才能按到底,单是行程就很容易增加 10 ms。那次测试中最快的键盘,行程也比其他键盘短得多。
- 扫描。大多数键盘把按键接成网格,并逐行检查。扫描较慢的键盘,可能在开关闭合几毫秒之后才发现你按了键。
- 防抖。开关触点闭合时会短暂弹跳。键盘要么立即报告按键并忽略弹跳,要么等触点稳定下来再报告。许多客制化键盘使用开源固件 QMK,它的默认防抖时间是 5 ms。
- USB 轮询。电脑按回报率向键盘询问是否有新输入。刚好在一次轮询之后按下的键,要等到下一次轮询。
回报率换算成毫秒
两次轮询之间的时间等于 1,000 ms 除以回报率。平均来说,一次按键要等这段时间的一半。
| 回报率 | 轮询间隔 | 平均等待 |
|---|---|---|
| 125 Hz | 8 ms | 4 ms |
| 250 Hz | 4 ms | 2 ms |
| 500 Hz | 2 ms | 1 ms |
| 1000 Hz | 1 ms | 0.5 ms |
| 8000 Hz | 0.125 ms | 0.0625 ms |
从 125 Hz 提高到 1,000 Hz,平均能节省 3.5 ms。实测键盘之间的差距远比这大:2017 年 Dan Luu 测了 21 款键盘,结果在 15 到 60 ms 之间,其中两款游戏键盘并不比其他键盘快。
键盘延迟是怎样测试的
- 电磁铁和 USB 分析仪。RTINGS 和 LTT Labs 用电磁铁按下按键,标记它碰到按键的时刻,再用 USB 分析仪记录这次按键离开键盘的时间。RTINGS 取 200 次按键的平均值。两家都会先把键盘调到最快的设置,比如最低的防抖和最高的回报率。
- 每种连接方式分开测。LTT Labs 分别测量有线、2.4 GHz 无线和蓝牙,因为不同连接方式的延迟可能相差很大。
- 逻辑分析仪。Dan Luu 用它测量从开始按键到产生对应 USB 数据包之间的间隔。
- 在家可以用相机或光传感器。用慢动作同时拍下按键和屏幕(每秒 240 帧,即每 4.2 ms 一帧),或者在屏幕上放一个光传感器,例如开源的 OSLTT。两种方法测的都是从按键到屏幕的整条链路,而不只是键盘。
为什么没有网站能测试键盘延迟
浏览器要等键盘发出按键、电脑再把它转交过来之后,才会得知这次按键,所以本页描述的所有环节,在网页开始计时之前就已经发生了。从出现信号到你按下按键的计时测试,测的是你的反应,而反应所需的时间远比键盘长。浏览器能检查的,是每个键是否都能被识别、能同时按下几个键(用键盘测试),以及按键是否会重复输入(用键盘双击测试)。
如何降低键盘延迟
- 把回报率调到最高。前提是厂商的软件提供这个设置。
- 调低防抖。如果软件允许调整,就调低,但要停在不会让按键重复输入的最低设置。如果开始出现重复字母,请看键盘为什么会打出重复字母。
- 缩短触发键程。磁轴键盘和模拟输入键盘可以设定按键按下多深才算触发。Wooting 等键盘上的 Rapid Trigger 还能让按键在你开始抬起的那一刻就松开,并在你重新按下的那一刻再次触发。
- 玩游戏时选最快的连接方式。如果你的键盘支持多种连接方式,就用评测中测得最快的那一种。
- 然后再看链路的其他部分。帧率和显示器带来的延迟通常比键盘更多:请看如何降低输入延迟。
线性轴、段落轴和有声轴有什么区别,以及厂商给出的触发键程和触发压力,见键盘轴体。
资料来源:Dan Luu(英文),键盘延迟;RTINGS(英文),键盘延迟测试方法;LTT Labs(英文),Labs 如何进行键盘测试;QMK(英文),防抖算法;Wooting(英文),如何设置 Rapid Trigger;OSLTT(英文),开源延迟测试工具。