语境
我和一个朋友正在玩一个游戏,其中对在游戏中扮演给定角色的优化是一次按住两个按钮,即它们键Q和E。这意味着在游戏中绑定到这些键的两个技能会交替出现。
即当持有Qand时E:Q E Q E Q E Q E Q E
问题
问题在于当我按住 Q 和 E 键时,我无法复制我朋友所做的事情。我得到的是:
IE。按住Qand时E:Q E E E E E E E E E
或E Q Q Q Q Q Q Q Q
(取决于首先检测到哪个键)
在与我的朋友讨论后,他说它的 n 键翻转除了防重影之外还允许它工作。
然而,一旦我们俩开始深入研究这一点,它就变得越来越没有意义了,因为我们的两个键盘都具有上述功能。如果它提供了额外的上下文,我们的两个键盘都列在下面。
- 我的朋友们:GMMK 全棕色开关
- 我的键盘: Razer Huntman Elite
我现在想弄清楚的是,是什么让他的键盘能够以它的方式操作,而我的键盘不能这样做。
防重影只有在至少按下三个键时才会发挥作用——它只与两个键无关,所以在这里没关系。
对于 USB 键盘,按键重复行为取决于软件,而不是键盘。键盘只是告诉计算机此时所有按下的键(直到键盘支持的“翻转”限制),并让计算机知道状态何时发生变化。操作系统负责将持有的按键列表与之前的状态进行比较,并生成适当的“按键按下”和“按键释放”事件,并且操作系统负责注意按键何时被按住一定量时间和产生额外的事件,如果合适的话。
我见过的每个系统的行为方式都与您描述系统行为的方式相同——typematic 只会为最后按下的键生成重复,并且只要它被按住(如果您释放该键,但仍按住其他键之前按过,根本没有重复)。但是由于行为是由软件定义的,所以应该可以在软件中覆盖它,只要键盘至少为 2KRO(基本上所有键盘都是;1KRO 将使熟练的触摸打字基本上不可能)。
为了回答这个问题,必须了解键盘的工作原理。
如果您回顾早期的键盘,您会发现插头上只有几个引脚,与键盘上的按键数量不同。
也就是说,如果您按下键盘上的一个键,它仍然会立即传输到计算机,没有任何延迟。那么这怎么可能呢?
键盘使用水平和垂直信号矩阵。如键盘上所示,所有键都布置在网格上。当您按下一个键时,它不仅会说“x”键被按下,而是会说,第 3 列和第 5 行上的键已被按下。这意味着最终数据行的数量不是键的数量,而只是行和列的数量(优化)。
现在当您同时按下多个键时问题就解决了,矩阵现在可以进入无法确定按下哪个键的状态,这就是为什么某些键盘一次只能按下 2 个键和第 3 个键的原因被忽略。
为了解决这个问题,矩阵已经过重新设计以减少这种情况的发生,这就是为什么一些键盘声称你可以按下 4 或 5 个键,但如果你找到神奇的组合,你会再次降到 2,但发生的次数要少得多经常由于大量的试验和错误。
因为这最后还是成了问题,所以用了其他方法来实际支持多个按键,称为防重影。这里的问题是它可以通过多种方式实现,这就是为什么有的键盘给QEQEQE,有的做QEEEE或EQQQQQ。
长话短说,在尝试允许同时按下多个键时,取决于开发预算和使用的方法,不同型号的同时按下多个键的行为是不同的。
较新的面向游戏的键盘将非常快速地将所有击键发送到计算机,通过 USB 发送到驱动程序,驱动程序可以告诉软件按下了哪些键,显示 QEQEQEQE,而较旧的键仍然使用矩阵并使用硬件键,仅显示 QEEEEEEE 或 EQQQQQQ .
对于 USB 键盘,如果键盘在同一个 HID 输入报告中发送两个键的按键事件,则在 Windows 中会发生这种“一次自动重复两个键”行为。我什至通过对QMK 键盘固件的自定义修改对此进行了测试,在那里我可以准确控制通过 USB 发送的 HID 输入报告。其他操作系统可能没有这种行为(例如,Linux 总是只选择一个键进行自动重复)。
至于为什么不同的键盘对这个特性有不同的行为,可能有几种解释:
对按键进行计时,以便在相同的 HID 输入报告中报告它们可能更难使用更高的扫描速率(因此在具有 250 Hz 速率的旧键盘上触发双自动重复可能比在具有 1000 Hz 的新键盘上更容易速度)。
尽管现在大多数“游戏”键盘都宣传“1000 Hz 频率”(因此间隔超过 1 毫秒的按键应该在单独的输入报告中报告),但这种广告并不总是 100% 诚实的——尤其是一些去抖即使检测到物理按键的间隔超过 1 毫秒,算法也可能导致报告的按键同步。
某些键盘可能会在固件中执行特殊处理(例如,与宏支持相关),这会导致为每个键状态更改生成单独的 HID 输入报告——如果键盘固件以这种方式编写,则从即使使用最精确的按键时间也是不可能的。
一种可能的解决方法是某些键盘支持宏,因此您可以编写一个宏来执行 QE,然后在按住宏键时让它重复。我曾经在暗黑破坏神 2 或 3 中在我的旧 Razer Blackwidow 上执行此操作。Razor 控制应用程序有一个宏编辑器,可以让我选择只发送一次序列或重复它,直到我停止按住键。如果您没有专用的宏键,您可以将宏设置为游戏中未使用的键(可能是功能键或反引号或类似的东西)。