API Gamepad HTML5 ограничен только 4 контроллерами?

Я правильно могу получить ввод от 4 контроллеров с помощью HTML5 Gamepad API в браузере.

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

У меня проблемы с получением данных от 8 контроллеров. Все эти контроллеры Xbox 360, я знаю, что у XInput API есть устаревшие ограничения. Но, глядя на документацию HTML5 API выше, я не вижу ничего, упоминающего ограничение или как API реализован.

navigator.getGamepads(); кажется, возвращает массив из 4 неопределенных пятен в Chrome и Edge, а также неопределенный массив в FireFox, который, по-видимому, доходит до предела 4.

Вы можете видеть, что Windows 10 проверяет, что у меня есть 8 контроллеров, подключенных к панели "Устройства", и все они работают до 4 геймпадов в браузере. Поэтому я задаюсь вопросом, почему API Gamepad ограничивает меня здесь - это дизайн API Gamepad или XInput?

8 контроллеров подключены

4 ответа

Решение

Хорошо, я провел несколько обширных исследований и тестирований и чувствую некоторую уверенность в ответе на это.

Спецификация Gamepad API не определяет ограничение для контроллеров, как вы можете видеть в связанной документации выше.

На практике, navigator.getGamepads() возвращает:

  • В Chrome GamepadList из 4 неопределенных значений, заполненных 4 Gamepad объекты.
  • В Edge массив объектов из 4 неопределенных значений, заполненный 4 Gamepad объекты.
  • В Firefox - массив с нулевой длиной, заполненный любым числом Gamepad объекты.

XInput, похоже, не является преступником, кроме как влияющим на реализацию, потому что в Firefox у меня было множество входных данных, помимо четырех, которые не были все распознаны в других браузерах.

Я думаю, что это можно объяснить плохой реализацией со стороны движков Chrome и Edge, и я могу только надеяться, что они увидят свет, а Firefox сохранит гибкость своей реализации. В идеале стандарт устанавливает закон однозначно.

До сих пор каждый раз, когда я использовал API-интерфейс GamePad в Chrome, изначально возвращался массив, содержащий четыре записи. "About:Help" для моей версии возвращает следующую информацию:

Версия 59.0.3071.115 (Официальная сборка) (64-битная)

При запуске моего кода с одним устройством ввода, подключенным к моему компьютеру, массив содержит следующие записи:

  • array [0]: объект GamePad для моего подключенного устройства;
  • массив [1]: ноль;
  • массив [2]: ноль;
  • массив [3]: ноль;

На данный момент у меня недостаточно запасных USB-портов, чтобы попробовать подключить более 3 устройств, поэтому, если у кого-то будет достаточно аппаратного обеспечения, будет интересным экспериментом выяснить, что произойдет, если вы подключите 5 геймпадов к компьютеру. и посмотрите, создает ли Chrome массив, достаточно большой для них всех.

Я обнаружил еще одну причуду: Вы должны нажать кнопку на одной из ваших геймпадов / джойстиков, прежде чем запускать любой код, вызывающий метод navigator.getGamePads(). Это функция безопасности, которая предотвращает прослушивание веб-страниц деталей вашего геймпада и отправку их злонамеренному объекту - если вам повезло, что вы взорвали пару тысяч фунтов на реалистичном устройстве F-16 HOTAS, вы не не хочу, чтобы эту информацию отправляли мошенникам. Однако на практике я обнаружил, что это не работает на моем компьютере. Даже после нажатия кнопки несколько раз, мой код всплывает в диалоговом окне, которое я закодировал, чтобы сказать "Геймпады не обнаружены". Затем я закрываю диалог, нажимаю кнопку на джойстике, пробую еще раз, и, эй, Presto, код обнаружения регистрирует мои устройства. Является ли это причудой Chrome или реплицируется в Firefox, я пока не проверял.

У меня возникает мысль: при тестировании кода вашего браузера попробуйте нажать кнопку на КАЖДОМ подключенном устройстве и посмотреть, не приведет ли это к тому, что API GamePad зарегистрирует все ваши устройства. Хотя я могу предвидеть одну проблему, которая может усложнить ваш тест, это то, что у вас подключено несколько идентичных устройств. Если вы можете найти коллекцию из 8 различных игровых планшетов и попробовать это, вы можете увидеть разные результаты.

В настоящее время существует ряд проблем с API GamePad, поскольку стандарт W3C для этого API еще не завершен - он все еще находится в стадии разработки. Как следствие, разные браузеры имеют разные детали реализации, пока у их разработчиков нет стабильного стандарта для работы.

Я обнаружил, что если я подключаю несколько контроллеров, а затем отключаю некоторые с более низкими индексами, нумерация chrome остается даже после обновления, а нумерация mozilla остается только до обновления. Это заставляет меня думать, что Chrome на самом деле берет данные из Windows (отсюда длина 4), в то время как Mozilla делает это сама.

Если реализации используют внутренний API xinput, 4 является пределом, если они могут распознавать Hid в дополнение к xinput, они могут теоретически обрабатывать и отображать больше с помощью API w3c, но это может стать запутанным и подверженным ошибкам, особенно при подключении нескольких устройств и выход..

Другие вопросы по тегам