HTML5 游戏手柄 API 是否仅限于 4 个控制器?

Is the HTML5 Gamepad API limited to only 4 Controllers?

通过在浏览器中使用 HTML5 游戏手柄 API,我能够正确地从 4 个控制器获得输入。

https://www.w3.org/TR/gamepad/

我遇到的问题是从 8 个控制器获取输入。这些都是 Xbox 360 控制器,我知道 XInput API 有一个遗留限制。但是查看上面的 HTML5 API 文档,我看不到任何提及限制或如何实现 API 的内容。

navigator.getGamepads(); 似乎 return Chrome 和 Edge 中的 4 个未定义点的数组,以及 FireFox 中似乎仍达到 4 个限制的未指定数组。

您可以看到 Windows10 验证我在“设备”面板中连接了 8 个控制器,并且所有控制器都可以在浏览器中最多单独使用 4 个游戏手柄。所以我想知道为什么 Gamepad API 在这里限制了我 - 是 Gamepad API 还是 XInput 的设计?

好的,我已经做了一些广泛的研究和测试,并且对回答这个问题充满信心。

Gamepad API 规范并未定义对控制器的限制,如您在上面的链接文档中所见。

实际上,navigator.getGamepads() returns:

  • 在Chrome中,一个GamepadList(现在这可能是一个普通的数组?)4个未定义的值,填充了 4 Gamepad 个对象。
  • 在(旧版)Edge 中,一个包含 4 个未定义值的数组,其中填充了 4 Gamepad 个对象。
  • 在 Firefox 中,长度为零的数组,填充任意数量的 Gamepad 个对象。

除了可能影响实现之外,XInput 似乎不是罪魁祸首,因为我能够在 Firefox 中混合超过四个的输入,而其他浏览器无法识别这些输入。

我认为这可以归因于 Chrome 和 Edge 背后的引擎部分实施不当,我只能希望他们看到光明并且 Firefox 保持其实施的灵活性。理想情况下,标准明确规定了法律。

到目前为止,每次我在 Chrome 中使用 GamePad API 时,它都会返回一个最初包含四个条目的数组。 "About:Help"我的版本returns以下信息:

版本 59.0.3071.115(正式版)(64 位)

当 运行 我的代码,在我的计算机上连接一个输入设备时,数组包含以下条目:

  • array[0]:我连接的设备的 GamePad 对象;
  • 数组[1]:空;
  • 数组[2]:空;
  • 数组[3]:空;

目前我没有足够的备用 USB 端口来尝试插入 3 个以上的设备,所以如果有人有必要的硬件慷慨,这将是一个有趣的实验,看看如果你连接会发生什么将 5 个游戏手柄连接到您的计算机,然后查看 Chrome 是否为它们创建了一个足够大的数组。

我发现的另一个怪癖是这个。您应该在 运行 任何调用 navigator.getGamePads() 方法的代码之前按下 gamepads/joysticks 之一的按钮。这是一项安全功能,可阻止网页监听您的游戏手柄详细信息,并将它们发送给恶意实体 - 如果您足够幸运,在逼真的 F-16 HOTAS 装置上投入了几千磅,您就不会不想将此信息发送给诈骗者。然而,在实践中,我发现这在我的电脑上不起作用。即使按了几次按钮,我的代码也会弹出我编码的对话框 "No gamepads detected"。然后我关闭对话,按下操纵杆上的一个按钮,再试一次,嘿,转眼间,检测代码注册了我的设备。这是 Chrome 怪癖,还是在 Firefox 中复制,我还没有测试。

我想到一个想法:在测试您的浏览器代码时,尝试在每个连接的设备上按下一个按钮,看看这是否会导致 GamePad API 注册您的所有设备。尽管我可以预见到一个可能会使您的测试复杂化的问题,那就是您连接了多个相同的设备。如果您能找到 8 个不同 游戏手柄的集合,然后尝试一下,您可能会看到不同的结果。

目前 GamePad API 存在一系列问题,因为此 API 的 W3C 标准尚未最终确定 - 它仍处于草案阶段。因此,不同的浏览器有不同的实现细节,直到其开发者有一个稳定的标准可以使用。

如果实现在内部使用 xinput API,则 4 是极限,如果除了 xinput 之外他们还能够识别 Hid,理论上他们可以通过 w3c API 处理和公开更多内容,但是它可能会变得复杂且容易出错,尤其是在多个设备进入和退出时..

我发现如果我插入多个控制器,然后拔掉一些索引较低的控制器,chrome 上的编号甚至在刷新后仍然存在,而在 mozilla 上编号只保留到刷新。这让我觉得 chrome 实际上是从 Windows 获取数据(因此长度为 4),而 mozilla 是自己做的。