Является ли API-интерфейс Game5 API только для 4 контроллеров?
Я правильно могу получить входные данные от 4 контроллеров, используя API-интерфейс HTML5 Gamepad в браузере.
https://www.w3.org/TR/gamepad/
У меня возникают проблемы с входом от 8 контроллеров. Это все контроллеры Xbox 360, я знаю, что существует устаревший предел для XInput API. Но, смотря на вышеперечисленную документацию по HTML5, я не вижу ничего упоминающего о пределе или о том, как реализован API.
navigator.getGamepads();
похоже, возвращает массив из 4 undefined пятен в Chrome и Edge и неопределенный массив в FireFox, который все еще, кажется, подходит к пределу 4.
Вы можете видеть, что Windows 10 проверяет, что у меня есть 8 контроллеров, подключенных на панели "Устройства", и все работают индивидуально до 4 геймпадов в браузере. Поэтому я задаюсь вопросом, почему API-интерфейс Gamepad ограничивает меня здесь - это дизайн API Gamepad или XInput?
![8 Подключенные контроллеры]()
Ответы
Ответ 1
Хорошо, я провел несколько обширных исследований и тестирования и почувствовал некоторую уверенность в том, что вы ответите на это.
Спецификация API Gamepad не определяет ограничение для контроллеров, как вы можете видеть в связанной документации выше.
На практике navigator.getGamepads()
возвращает:
- В Chrome,
GamepadList
из 4 undefined значений, заполненных
4 Gamepad
объектов.
- В Edge массив объектов из 4 undefined, заполненный
4
Gamepad
объектов.
- В FireFox массив с нулевой длиной, заполненный любым количеством объектов
Gamepad
.
XInput, по-видимому, не является виновником другого, чем может повлиять на реализацию, потому что в FireFox я смог собрать входы вне четырех, которые не были распознаны в других браузерах.
Я думаю, что это может быть доведено до плохой реализации со стороны двигателей за Chrome и Edge, и я могу только надеяться, что они увидят свет, и FireFox сохраняет гибкость в их реализации. В идеале стандарт гласит закон недвусмысленно.
Ответ 2
До сих пор, каждый раз, когда я использовал GamePad API в Chrome, он сначала возвращал массив, содержащий четыре записи. "О программе: Справка" для моей версии возвращает следующую информацию:
Версия 59.0.3071.115 (Официальная сборка) (64-разрядная версия)
При запуске моего кода с одним устройством ввода, подключенным к моему компьютеру, массив содержит следующие записи:
- array [0]: объект GamePad для подключенного устройства;
- array [1]: null;
- array [2]: null;
- array [3]: null;
В настоящий момент у меня недостаточно запасных USB-портов, чтобы попытаться подключить более 3-х устройств, поэтому, если у кого-то есть необходимая аппаратная щедрость, будет интересным экспериментом, чтобы узнать, что произойдет, если вы присоедините 5 игровых приставок на ваш компьютер и посмотрите, создает ли Chrome массив, достаточно большой для всех.
Еще одна причуда, которую я обнаружил, - это. Вы должны нажать кнопку на одном из ваших игровых приставок/джойстиков, прежде чем запускать любой код, вызывающий метод navigator.getGamePads(). Это функция безопасности, позволяющая останавливать веб-страницы, которые прослушивают ваши данные геймпада, и отправлять их злоумышленнику - если вам повезет, что вы набрали пару тысяч фунтов на реалистичном модуле F-16 HOTAS, чтобы эта информация отправлялась мошенникам. Однако на практике я обнаружил, что это не работает на моем компьютере. Даже после нажатия кнопки несколько раз, мой код выдает диалоговое окно, которое я закодировал, чтобы сказать "Нет игровых приставок". Затем я отключаю диалог, нажимаю кнопку на джойстике, повторю попытку, и, прежде всего, код обнаружения регистрирует мои устройства. Является ли это причудой Chrome или реплицируется в Firefox, я еще не тестировал.
Мне пришла в голову мысль: при тестировании кода браузера попробуйте нажать кнопку на КАЖДОМ подключенном устройстве и посмотреть, приведет ли это к тому, что GamePad API зарегистрирует все ваши устройства. Хотя одна проблема, которую я могу предвидеть, может осложнить ваш тест, заключается в том, что у вас есть несколько идентичных устройств. Если вы можете найти коллекцию из 8 разных геймпадов и попробовать это, вы можете увидеть разные результаты.
В настоящее время существует ряд проблем с API GamePad, поскольку стандарт W3C для этого API еще не завершен - он все еще находится на стадии проекта. Как следствие, разные браузеры имеют разные детали реализации, пока их разработчики не будут иметь стабильный стандарт для работы.