GameInput está diseñado principalmente en torno a un modelo de sondeo, existen casos en los que es mejor notificar a las aplicaciones de forma asincrónica. Para admitir esto, la interfaz IGameInput expone algunos métodos para registrar funciones de devolución de llamada que se invocan cuando se producen determinados eventos de interés.
Internamente, GameInput serializa el envío de las devoluciones de llamada de modo que solo se ejecute una devolución de llamada a la vez. GameInput garantiza que las devoluciones de llamada se envían en orden cronológico. Estas garantías simplifican el código que una aplicación necesita escribir en sus funciones de devolución de llamada.
GameInput permite un máximo de 64 devoluciones de llamada registradas en cualquier momento, independientemente del tipo. Las devoluciones de llamada se envían desde un subproceso de trabajo interno de GameInput. Para obtener más información sobre cómo funciona esto, junto con las opciones para programar manualmente este trabajo, consulte Colas de trabajo de GameInput.
Devoluciones de llamada de dispositivo
Las devoluciones de llamada de dispositivo proporcionan una manera de que las aplicaciones sepan cuándo cambia el estado de los dispositivos de entrada, como se muestra en la sintaxis siguiente. Lo más habitual es que se usen para detectar cuándo se conectan y desconectan los dispositivos, pero otros cambios de estado también pueden ser de interés.enumerationKind toma un valor de la enumeración GameInputEnumerationKind, que indica si la enumeración debe realizarse como parte del registro de la devolución de llamada y, en tal caso, si la enumeración debe realizarse de forma bloqueante o asincrónica. Combinar la enumeración de dispositivos con los cambios de estado posteriores en una única operación atómica evita las condiciones de carrera que muchas aplicaciones sufren de forma involuntaria en su código de entrada.
Devoluciones de llamada de lectura
Mediante las devoluciones de llamada de lectura, las aplicaciones pueden recibir una notificación cada vez que llegan nuevas lecturas a la secuencia de entrada, como se muestra en la sintaxis siguiente. Aunque muchas aplicaciones encontrarán que el sondeo de la entrada es mejor, existen situaciones en las que la entrada controlada por eventos puede ser preferible. Por ejemplo, la interfaz de usuario del menú principal de un juego podría adaptarse mejor a la entrada basada en eventos. Otro ejemplo es una interfaz de usuario de asignación de entrada que debe esperar la entrada después de pedirle al usuario su selección.Anulación del registro de devoluciones de llamada
Después de registrar correctamente una devolución de llamada, la aplicación debe garantizar que todos los recursos necesarios para ejecutar la devolución de llamada sigan siendo válidos. Esto incluye tanto los recursos consumidos por el código de la devolución de llamada como la propia función de devolución de llamada, por ejemplo, si la función de devolución de llamada está hospedada en un archivo DLL que la aplicación carga y descarga a petición. Para reclamar de forma segura estos recursos, una aplicación debe primero anular el registro de la devolución de llamada pasando el token que recibió del métodoRegister*Callback al método UnregisterCallback. Si la devolución de llamada se está ejecutando cuando se llama a este método, se bloquea hasta que la devolución de llamada termina de ejecutarse. Como resultado, una devolución de llamada no puede anular su propio registro desde su propia función de devolución de llamada.
Las devoluciones de llamada también se pueden detener llamando al método StopCallback. Esto no anula el registro de la devolución de llamada, pero garantiza que no se vuelva a llamar. Como el registro de la devolución de llamada no se anula, este método es seguro para llamarlo desde la propia función de devolución de llamada. Termina de ejecutar la devolución de llamada actual, pero no la vuelve a llamar. El registro de las devoluciones de llamada debe anularse en algún momento, ya que solo se permiten 64 devoluciones de llamada en cualquier momento.
