tester javascript html html5 gamepad gamepad-api

javascript - tester - ¿Está la API de Gamepad de HTML5 limitada a solo 4 controladores?



gamepad api (4)

Soy capaz de obtener información de 4 controladores mediante el uso de la API HTML5 Gamepad dentro de un navegador.

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

Lo que estoy teniendo problemas con es obtener la entrada de 8 controladores. Al ser todos los controladores de Xbox 360, sé que hay un límite heredado para la API XInput. Pero mirando la documentación de la API HTML5 anterior, no puedo ver nada que mencione un límite o cómo se implementa la API.

navigator.getGamepads(); parece devolver una matriz de 4 puntos no definidos en Chrome y Edge, y una matriz no especificada en FireFox que todavía parece ir a un límite de 4.

Puede ver que Windows 10 verifica que tengo 8 controladores conectados en el panel de Dispositivos, y todos trabajan individualmente hasta 4 gamepads dentro del navegador. Entonces, me pregunto por qué la API de Gamepad me está limitando aquí: ¿es por diseño de la API de Gamepad o XInput?


Descubrí que si conecto varios controladores y luego desconecto algunos con índices más bajos, la numeración cromada permanece incluso después de la actualización, mientras que la numeración de Mozilla solo permanece hasta la actualización. Esto me hace pensar que Chrome realmente toma los datos de Windows (de ahí la longitud 4), mientras que Mozilla lo hace por sí solo.


Hasta ahora, cada vez que he usado la API GamePad en Chrome, se devuelve una matriz que contiene cuatro entradas inicialmente. El "Acerca de: Ayuda" para mi versión devuelve la siguiente información:

Versión 59.0.3071.115 (compilación oficial) (64 bits)

Cuando ejecuto mi código, con un dispositivo de entrada conectado a mi computadora, la matriz contiene las siguientes entradas:

  • array [0]: objeto GamePad para mi dispositivo conectado;
  • array [1]: null;
  • array [2]: nulo;
  • array [3]: null;

Por el momento, no tengo suficientes puertos USB de repuesto para intentar conectar más de 3 dispositivos, por lo que si alguien tiene la generosidad de hardware necesaria, será un experimento interesante para averiguar qué sucede si conecta 5 gamepads a su computadora. , y ver si Chrome crea una matriz lo suficientemente grande para todos ellos.

Otra peculiaridad que he descubierto es esta. Se supone que debes presionar un botón en uno de tus gamepads / joysticks antes de ejecutar cualquier código que llame al método navigator.getGamePads (). Esta es una función de seguridad para evitar que las páginas web escuchen los detalles de su gamepad y se los envíen a una entidad malintencionada. Si tiene la suerte de haber disparado un par de miles de libras en una unidad realista de F-16 HOTAS, no lo haga. No quiero que esta información se envíe a los estafadores. Sin embargo, en la práctica, he encontrado que esto no funciona en mi computadora. Incluso después de presionar un botón varias veces, mi código muestra el cuadro de diálogo que codifiqué para decir "No se detectaron gamepads". Luego descarté el diálogo, presioné un botón en el joystick, lo intenté de nuevo y, listo, el código de detección registra mis dispositivos. Ya sea que se trate de una peculiaridad de Chrome o se replique en Firefox, todavía no la he probado.

Se me ocurre una idea: al probar el código de su navegador, intente presionar un botón en CADA dispositivo conectado, y vea si eso hace que la API de GamePad registre todos sus dispositivos. Aunque un problema que puedo prever, que podría complicar su prueba, es que tiene conectados múltiples dispositivos idénticos. Si puedes encontrar una colección de 8 gamepads diferentes y, si lo intentas, puedes ver resultados diferentes.

Hay una serie de problemas con la API GamePad en este momento, debido al hecho de que el estándar W3C para esta API aún no se ha finalizado, aún está en la fase de borrador. Como consecuencia, los diferentes navegadores tienen diferentes detalles de implementación, hasta que los desarrolladores de los mismos tienen un estándar estable con el que trabajar.


Ok, he hecho una extensa investigación y pruebas y siento cierta confianza al responder esto.

La especificación de la API de Gamepad no define un límite para los controladores, como se puede ver en la documentación vinculada arriba.

En la práctica, navigator.getGamepads() devuelve:

  • En Chrome, una GamepadList de GamepadList de 4 valores indefinidos, llena de 4 objetos de Gamepad .
  • En Edge, una matriz de objetos de 4 valores indefinidos, llena de 4 objetos Gamepad .
  • En Firefox, un Array con longitud cero, lleno de cualquier número de objetos de Gamepad .

XInput no parece ser el culpable más que tal vez influir en la implementación, porque pude tener una mezcla de entradas más allá de cuatro en Firefox que no fueron todas reconocidas en los otros navegadores.

Creo que esto se puede atribuir a una mala implementación por parte de los motores detrás de Chrome y Edge, y solo puedo esperar que vean la luz y Firefox mantiene su implementación flexible. Idealmente, la norma establece la ley de manera inequívoca.


Si las implementaciones usan la API xinput internamente, 4 es el límite, si son capaces de reconocer Hid además de xinput, podrían teóricamente dar masajes y exponer más a través de la API w3c, pero pueden complicarse y ser propensos a errores, especialmente con la entrada de múltiples dispositivos saliendo ..