【问题标题】:Is the HTML5 Gamepad API limited to only 4 Controllers?HTML5 Gamepad API 是否仅限于 4 个控制器?
【发布时间】:2023-03-18 23:35:01
【问题描述】:

通过在浏览器中使用 HTML5 Gamepad API,我能够正确地从 4 个控制器获取输入。

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

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

navigator.getGamepads(); 似乎在 Chrome 和 Edge 中返回了一个包含 4 个未定义点的数组,而在 FireFox 中返回了一个似乎仍然达到 4 个限制的未指定数组。

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

【问题讨论】:

  • 我也很好奇我应该骚扰谁,以防止像旧版 XInput 在此限制下所做的那样无休止的未来数小时的挫败感。
  • ... 所以城里有一个 HTML5 Gamepad API。不知何故,这已经从我的生活中消失了。

标签: javascript html gamepad gamepad-api


【解决方案1】:

好的,我已经进行了一些广泛的研究和测试,并且对回答这个问题感到有些信心。

Gamepad API 规范没有定义控制器的限制,您可以在上面的链接文档中看到。

在实践中,navigator.getGamepads() 返回:

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

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

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

【讨论】:

  • 你觉得你可以做两套游戏手柄吗?可能将所有游戏手柄放在一个数组中,然后拆分数组并显示两组 4?可能是不可能的,但只是随地吐痰
  • 可以通过从返回的数组中删除游戏手柄来执行您建议的操作,看看这是否会为其他游戏手柄的出现创造空间,但不知道 navigator.getGamepads() 背后的实现以及 Chrome 和 Edge 如何检测我不太自信的控制器。
  • @MattTreichelYeah 你试过打开 Chrome 的错误报告吗?
  • @tambre 是的,在这里,虽然我不熟悉评论的含义:bugs.chromium.org/p/chromium/issues/detail?id=676222
  • @MattTreichelYeah M-55 表示 Chrome 55 是修复该错误的里程碑,我猜 TE-Hardware-Dependency 表示该错误的测试取决于硬件。我实际上有兴趣深入研究这个,但我周围没有任何控制器:P
【解决方案2】:

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

版本 59.0.3071.115(官方版本)(64 位)

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

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

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

我发现的另一个怪癖是这个。在运行任何调用 navigator.getGamePads() 方法的代码之前,您应该按下一个游戏手柄/操纵杆上的按钮。这是一项安全功能,可阻止网页侦听您的游戏手柄详细信息,并将其发送给恶意实体 - 如果您有幸在真实的 F-16 HOTAS 装置上砸了几千英镑,您就不会’不希望将此信息发送给诈骗者。但是,在实践中,我发现这在我的计算机上不起作用。即使按了几次按钮,我的代码也会弹出我编写的对话框,说“未检测到游戏手柄”。然后我关闭对话,按下操纵杆上的按钮,再试一次,嘿,检测代码注册了我的设备。这是 Chrome 的怪癖,还是在 Firefox 中被复制,我还没有测试。

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

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

【讨论】:

  • 感谢您的研究。是的,Chrome 确实有 4 个游戏手柄的当前硬限制 - 这里有一些关于更改它的来回讨论:bugs.chromium.org/p/chromium/issues/detail?id=146285。 Firefox 对我很好,连接至少 12 个控制器没有任何问题,除了它不会对超过 4 个 XInput 控制器进行任何额外检测。
【解决方案3】:

我发现,如果我插入多个控制器,然后拔下一些索引较低的控制器,chrome 编号即使在刷新后也会保持不变,而在 mozilla 上编号只会保持到刷新。这让我觉得 chrome 实际上是从 Windows 获取数据(因此长度为 4),而 mozilla 是自己完成的。

【讨论】:

    【解决方案4】:

    如果实现在内部使用 xinput API,则限制为 4,如果他们能够识别除 xinput 之外的 Hid,理论上他们可以通过 w3c API 按摩和暴露更多信息,但它可能会变得复杂且容易出错,尤其是多个设备进出..

    【讨论】:

      猜你喜欢
      • 2019-04-11
      • 2020-07-01
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 2018-09-09
      • 2011-11-04
      相关资源
      最近更新 更多