工作原理
报告与连接
手柄不会在每次按下发生时就立即将其发送出去。它每秒多次发送报告,即它在那一刻的全部状态:每个按键、摇杆和扳机,有些手柄还包括体感、触摸和电池。电脑再将这些报告转交给游戏和 PadBench。
报告与回报率
一个报告有几十个字节,按手柄厂商选定的方式排列:每个按键占一个位,按住时置位;每个摇杆轴和扳机各占一个数值,大多数手柄为 0 至 255,有些手柄更精细。手柄每秒发送的报告数就是它的回报率,单位为赫兹:通常为 125 或 250,许多街机控制器(例如运行 GP2040-CE 的控制器)为 1,000,少数近期的手柄可达 8,000。
一次按下会随手柄的下一个报告发出,因此报告之间的间隔(125 Hz 时为 8 ms,1,000 Hz 时为 1 ms)就是一次按下离开手柄前最长的等待时间。这正是更高回报率带来的好处:按下发送得更早,计时也更精细。
有些手柄一有机会就发送报告,无论状态是否变化;另一些手柄只在有变化时才发送,因此在没有任何操作时计数会下降,但这并不代表有问题。
USB、蓝牙和无线接收器
通过 USB 连接时,电脑按手柄在插入时请求的节奏收取它的报告:在大多数手柄使用的全速连接上,最多每毫秒一次;在高速连接上,最快每 125 µs 一次,即每秒 8,000 次。有线连接的时间间隔最为稳定。
通过蓝牙连接时,手柄与电脑的蓝牙模块商定一个节奏,通常比有线连接慢;而且蓝牙模块要与它连接的其他所有设备分享时间,因此报告到达得不那么均匀,有时会成批到达。“回报率”卡片会将此显示为更分散的分布和更长的间隔。
无线接收器是手柄专用的无线模块,装在 USB 插头上:电脑看到的是一个 USB 设备,按接收器请求的节奏收取报告。接收器发给电脑的报告可能比它从手柄收到的更多,重复发送最新的那一个,因此它的回报率反映的是电脑多久收到一次接收器的报告,而不是每个报告有多新。
HID 与 XInput
大多数手柄与键盘和鼠标一样,是 HID 设备,即人体学输入设备。每个 HID 设备都带有一个描述符,说明它的按键和轴位于报告中的什么位置,因此电脑能读取从未见过的手柄;不过许多手柄会将更丰富的部分(例如索尼手柄的触摸板和体感)放在自己特有的布局中,读取方必须事先了解。许多手柄所说的 DirectInput 模式就属于这一类。
在 Windows 上,Xbox 手柄以及处于 XInput 模式的手柄(许多 PC 手柄默认以此模式启动)通过微软自有的接口 XInput 读取。XInput 交出的是手柄的状态,即按键、摇杆、扳机和电池,而不是它的报告,且最多支持四个手柄;它只告知状态发生了变化,而不告知手柄何时发送了报告。因此,Windows 应用对 Xbox 手柄统计的是状态变化,而不是报告。
同一手柄的读数为何可能不同
同一个手柄在每种连接方式和每种模式下的标识可能不同:ID 不同、报告不同,甚至名称也不同。通过蓝牙连接的 DualShock 4 或 DualSense 以简化报告启动,不含触摸板、体感和电池,直到有程序将其切换到完整报告。许多手柄在一种模式下标识为 Xbox 手柄,在另一种模式下标识为 Switch 或 PlayStation 手柄,PadBench 会显示手柄在每种模式下标识为哪种手柄。
每种浏览器读取手柄的方式也各不相同:它按自己的映射为按键编号,可能施加自己的死区(Chrome 和 Firefox 对 Switch 手柄就是如此,因此其摇杆静止时恰好为 0),并按自己的节奏将读数交给网页。同一个手柄在一种浏览器中表现正常、在另一种中却很奇怪时,差异通常来自浏览器。