Javascript HTML5 Gamepad API是否仅限于4个控制器?

Javascript HTML5 Gamepad API是否仅限于4个控制器?,javascript,html,gamepad,gamepad-api,Javascript,Html,Gamepad,Gamepad Api,通过在浏览器中使用HTML5 Gamepad API,我能够正确地从4个控制器获取输入 我遇到的问题是从8个控制器获取输入。这些都是Xbox 360控制器,我知道XInput API有一个传统的限制。但是看看上面的HTML5API文档,我看不到任何提到限制或API是如何实现的 navigator.getGamepads()在Chrome和Edge中似乎返回了一个由4个未定义的点组成的数组,而在FireFox中则返回了一个未指定的数组,该数组似乎仍然限制在4个点 您可以看到Windows 10验

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

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

navigator.getGamepads()
在Chrome和Edge中似乎返回了一个由4个未定义的点组成的数组,而在FireFox中则返回了一个未指定的数组,该数组似乎仍然限制在4个点

您可以看到Windows 10验证我在“设备”面板中连接了8个控制器,并且所有控制器在浏览器中最多可单独工作4个游戏板。所以我想问为什么Gamepad API会限制我在这里——这是因为Gamepad API的设计,还是XInput


好的,我做了一些广泛的研究和测试,对回答这个问题有信心

Gamepad API规范没有定义控制器的限制,正如您在上面链接的文档中所看到的那样

实际上,
navigator.getGamepads()返回:

  • 在Chrome中,由4个未定义值组成的
    GamepadList
    ,用 4
    Gamepad
    对象
  • 在(传统)边中,一个包含4个未定义值的对象数组,用 4
    Gamepad
    对象
  • 在Firefox中,长度为零的数组,填充了任意数量的
    Gamepad
    对象
XInput似乎不是罪魁祸首,只是可能影响了实现,因为我能够在Firefox中混合输入四种以上的内容,而这些内容在其他浏览器中都无法识别


我认为这可能是因为Chrome和Edge背后的引擎实现不好,我只能希望他们看到光明,Firefox保持其实现的灵活性。理想情况下,标准明确地规定了法律。

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

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

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

  • 数组[0]:我连接的设备的GamePad对象
  • 数组[1]:空
  • 数组[2]:空
  • 数组[3]:空
目前,我没有足够的备用USB端口来尝试插入3个以上的设备,因此,如果有人拥有必要的硬件资源,那么这将是一个有趣的实验,以了解如果将5个游戏板连接到计算机上会发生什么,并查看Chrome是否为所有设备创建了足够大的阵列

我发现的另一个怪癖是。在运行任何调用navigator.getGamePads()方法的代码之前,您应该按下其中一个游戏板/操纵杆上的按钮。这是一个安全功能,可以阻止网页监听你的游戏板详细信息,并将其发送给恶意实体——如果你足够幸运,在一个真实的F-16 HOTAS装置上炸了几千英镑,你不希望这些信息被发送给骗子。然而,在实践中,我发现这在我的电脑上不起作用。即使按了几次按钮,我的代码也会弹出一个对话框,上面写着“未检测到游戏机”。然后我关闭对话,按下操纵杆上的按钮,再试一次,嘿,presto,检测代码注册了我的设备。无论这是一个Chrome的怪癖,还是在Firefox中被复制,我还需要测试

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


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

如果实现在内部使用xinput API,4是限制,如果他们能够识别xinput之外的Hid,从理论上讲,他们可以通过w3c API进行更多的按摩和公开,但这会变得复杂和容易出错,尤其是在多个设备进出的情况下。

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

我也很好奇,我应该骚扰谁,以避免像legacy XInput那样在未来数小时内对这一限制感到无休止的沮丧。。。。所以镇上有一个HTML5游戏板API。不知怎么的,我的生活中一直没有这个。你觉得你能做两套游戏板吗?可能将所有游戏板放在一个阵列中,然后拆分阵列并显示两组4?可能不可能,但Spitballing可能会执行您建议的操作,从返回的阵列中移除游戏板,看看这是否会为其他游戏板的显示创造空间,但不知道navigator.getGamepad()背后的实现还有Chrome和Edge如何检测控制器,我不太自信。@MattTreichelYeah你有没有试过为Chrome打开一个bug报告?@tambre有,在这里,虽然我不熟悉注释的含义:@MattTreichelYeah
m-55
表示Chrome 55是修复bug的里程碑,我猜
TE硬件取决于