Ограничен ли API геймпада HTML5 только 4 контроллерами?

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

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

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

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

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

«Подключено


person MattTreichel    schedule 20.12.2016    source источник
comment
Также любопытно, кого я должен беспокоить, чтобы попытаться предотвратить бесконечные будущие часы разочарования, как это делает устаревший XInput с этим ограничением.   -  person MattTreichel    schedule 21.12.2016
comment
... так что в городе есть HTML5 Gamepad API. Этого как-то не хватало в моей жизни.   -  person John Weisz    schedule 22.12.2016


Ответы (4)


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

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

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

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

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

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

person MattTreichel    schedule 21.12.2016
comment
Как вы думаете, вы можете сделать два набора геймпадов? Возможно, поместить все геймпады в массив, затем разделить массив и показать два набора по 4? Вероятно, это невозможно, но просто плевать - person ntgCleaner; 22.12.2016
comment
Может быть, можно сделать что-то вроде того, что вы предлагаете, удалив геймпады из возвращаемого массива и посмотреть, создаст ли это место для появления других геймпадов, но не зная реализации navigator.getGamepads() и того, как Chrome и Edge обнаруживают контроллеры, которые я Я не слишком уверен. - person MattTreichel; 22.12.2016
comment
@MattTreichelYeah Вы пытались открыть отчет об ошибке для Chrome? - person tambre; 03.01.2017
comment
@tambre Да, здесь, хотя я не знаком со значениями комментариев: bugs.chromium.org/p/chromium/issues/detail?id=676222 - person MattTreichel; 03.01.2017
comment
@MattTreichelYeah M-55 указывает на то, что Chrome 55 является вехой для исправления ошибки, и я предполагаю, что TE-Hardware-Dependency указывает на то, что тестирование ошибки зависит от оборудования. На самом деле мне было бы интересно покопаться в этом, но у меня нет никаких контроллеров: P - person tambre; 03.01.2017

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

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

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

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

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

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

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

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

person David Edwards    schedule 01.08.2017
comment
Спасибо за исследование. Да, в настоящее время в Chrome установлено жесткое ограничение в 4 геймпада — здесь обсуждаются его изменения: bugs.chromium.org/p/chromium/issues/detail?id=146285. Firefox был хорош для меня, у меня не было проблем с подключением как минимум 12 контроллеров, за исключением того, что он не выполняет никакого дополнительного обнаружения для более чем 4 контроллеров XInput. - person MattTreichel; 01.08.2017

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

person Vojta Doležal    schedule 06.07.2018

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

person M Sn    schedule 27.04.2018