工作原理
读取方式
PadBench 通过一种读取方式读取每个手柄:起初是浏览器的 Gamepad API,你允许某个手柄后是 WebHID,此外还有 Windows 应用的引擎和键盘。读取方式决定了能测量什么,每个数值都会说明其读取方式能统计到什么。
浏览器的 Gamepad API
所有浏览器都支持 Gamepad API,在你另作选择之前,PadBench 通过它读取每个手柄。手柄由浏览器自己读取,页面每帧向浏览器询问一次手柄的状态,在大多数屏幕上为每秒 60 次,且绝不会比浏览器读取手柄更频繁:在 Chrome 和 Firefox 中最快每 4 ms 一次,在 Safari 中为每秒 120 次。
因此,短于一帧的按下可能被遗漏,手柄自身的报告也无法统计:没有回报率和按键连击次数,也没有体感、触摸和电池,因为 Gamepad API 不传递这些数据。浏览器只有在手柄于页面上被使用过之后才会显示它,而有些按键,例如 DualSense 的静音键,浏览器从不报告。
WebHID
WebHID 适用于电脑上的 Chrome 和 Edge,能逐个报告地读取手柄。它能统计真实的回报率,看到每一次按下,无论多短,因此可以统计连击;它还能读取 Gamepad API 遗漏的内容:Gamepad API 不报告的按键,DualSense、DualShock 4 和 Switch Pro 手柄的体感传感器和电池,以及索尼手柄的触摸板。此外,它能设置 DualSense 或 DualShock 4 的灯光,以及 DualSense 的扳机效果。
浏览器只有在你允许后,才会通过 WebHID 打开手柄。请在手柄的工具栏中选择“WebHID”(它位于“Gamepad API”旁边),或在“按键”卡片、手柄的某个标签页或游戏提供“使用 WebHID”时选择它,然后在浏览器的列表中选中这个手柄。浏览器会为此网站记住它;在手柄的“手柄”标签页中,选择 WebHID 旁边的“忘记”即可撤销。浏览器根本没有列出的手柄,可以通过各手柄标签页后面的“+”添加。
Windows 应用不需要 WebHID:它的引擎会自行逐个报告地读取每个手柄,无需任何授权。
PadBench 没有解码器的手柄,会根据其自身的描述符读取,在 PadBench 知道哪个控件是哪个之前,控件只以编号表示。在 Windows 上,WebHID 通过 Windows 的 Xbox 驱动为 Xbox 手柄创建的设备读取它:可得到回报率和每一次按下,但不能振动。
WebUSB
一个 USB 设备可以提供多个接口,每个接口都是一条独立的通道。WebHID 能访问手柄的 HID 接口,所有手柄的按键和摇杆都通过它传输。WebUSB 适用于电脑上的 Chrome 和 Edge,能访问其他接口,但无法访问 HID 接口。在 PadBench 中只有一个手柄需要它,即 Switch 2 Pro 手柄:它的按键和摇杆与其他手柄一样通过 WebHID 传输,但在通过任天堂自有的第二个接口完成设置之前,它不发送任何数据。PadBench 通过这个接口设置手柄、从手柄的存储器中读取摇杆校准数据,并设置玩家指示灯。
因此,这个手柄需要两次授权:WebHID 的授权通过各手柄标签页后面的“+”进行,WebUSB 的授权通过它主区域中的“开始设置”进行,或在“摇杆”卡片或“灯光”卡片提供“通过 WebUSB 允许”时通过它进行。浏览器会为此网站记住这两项授权。同一时间只有一个程序能占用第二个接口,因此当 Steam、Windows 应用或另一个标签页占用它时,PadBench 无法访问。在 Windows 上,该接口还需要使用 WinUSB 驱动。
Windows 应用会通过 Windows 的 WinUSB 驱动自行访问手柄的第二个接口,无需任何授权。同一时间只有一个程序能占用该接口,因此当 Steam 或浏览器占用它时,应用无法设置这个手柄。
Windows 应用的引擎
Windows 应用通过自己的引擎读取手柄,游戏处于前台时也会持续读取,因此你可以在游戏运行时进行测试。它逐个报告地读取 PlayStation、Switch 和其他 HID 手柄,每秒最多 8,000 个报告,包括体感、触摸板和电池,无需授权提示;Xbox 手柄则通过 XInput 按状态变化读取,包括 Xbox 键和电池。
键盘
键盘读取方式将键盘当作手柄读取,适用于处于键盘模式的全按键控制器或 Hitbox,也可用于用键盘玩游戏。各个按键代表手柄的控件,默认采用 GP2040-CE 键盘模式的映射,因此这类控制器无需任何改动即可使用:箭头键对应方向键,左 Shift、Z、左 Ctrl 和左 Alt 对应正面按键,依此类推。在键盘的“手柄”标签页中可以更改其中任意一个。
每一次按下和松开都能收到,不会遗漏;不过,键盘只在按键状态变化时才发送,因此没有可统计的回报率。
在浏览器中,只读取已映射的按键,且仅在键盘测试区域获得焦点时读取;浏览器还会为自己保留少数快捷键,例如关闭标签页。Windows 应用的键盘捕获即使在游戏处于前台时也能读取已映射的按键。
在你关闭键盘捕获之前,即使焦点位于其他应用,它也会读取已映射的按键,且只读取这些按键。
键盘模式的开关“将键盘用作手柄”位于手柄标签页一栏的末尾,仅在开启调试信息时显示。
触摸、体感和电池
对于手柄的触摸板、体感传感器和电池,每种读取方式会给出以下三种情况之一:能读取;手柄只有在切换到完整报告后才会发送,例如通过蓝牙连接的索尼手柄;或无法通过这种读取方式读取,例如浏览器的 Gamepad API 就不传递其中任何一项。
WebHID 和 Windows 应用能读取 DualSense 和 DualShock 4 的全部三项,以及 Switch Pro 手柄的体感和电池;应用还能读取 Xbox 手柄的电池。如果读取方式无法读取某一项,手柄的“手柄”标签页会说明原因,并在“使用 WebHID”能读取它时提供这一选项。
“原始数据”标签页和调试信息
每个手柄的“原始数据”标签页会按读取方式报告的原样显示手柄,即 PadBench 解读之前的状态:它的 ID 和映射,原样传来的按键和轴(每一项旁边标出它在手柄报告中的位置),识别出的型号,是每次按下都能收到,还是定时采样读数,以及回报率统计的是什么;在读取方式传递报告的情况下,还会逐字节显示这些报告。在四秒内于手柄上依次按 A、B、X 和 Y,再按 Y、B 和 A,按位置而非标识来按:下、右、左、上、上、右、下,调试信息也会随之显示:状态栏中的“打开录制文件”(即使尚未连接手柄也会显示),以及键盘模式的开关。再进行一次同样的按键操作,即可将它们隐藏。
对于同时通过两种方式读取的手柄,其“原始数据”标签页会比较两种读数:只有其中一种读取方式报告的控件、各自的摇杆分辨率,以及 Gamepad API 比 WebHID 晚多久看到每次按下。“复制详细信息”会复制以上全部内容,以便提交报告。