No he mirado el código en profundidad, pero la idea básica es que los eventos de entrada son asíncronos en Android, lo que significa que podrían ocurrir en cualquier momento. No desea interrumpir su código de bucle principal para procesar eventos de entrada porque podría ralentizar su juego y podría alterar su estado de juego de maneras inesperadas.
El enfoque tradicional utilizado en la muestra de Lunar Lander es tener un bloque sincronizado alrededor del bucle principal y alrededor de cada uno de sus controladores de entrada para garantizar que nunca sucedan al mismo tiempo. Este podría ser un enfoque válido para un juego pequeño, pero a medida que su juego se vuelva más complicado, verá que no es muy eficiente y que podría no funcionar correctamente.
El artículo sugiere un mejor enfoque para almacenar los eventos de entrada en una cola y procesarlos en un punto conocido de su ciclo principal. Los controladores de entrada simplemente empujan el evento (después de envolverlos en un objeto de entrada que los describe) hasta el final de la cola, y luego se procesan en el método processInput en el hilo del juego.
El autor del artículo en realidad usa dos colas, una cola de entrada y un grupo de objetos de entrada. El grupo de objetos de entrada en la actividad principal se usa porque no queremos seguir creando nuevos objetos de entrada cada vez que recibimos un evento de entrada. Esto es malo porque los eventos de entrada ocurren con frecuencia y la creación de muchos objetos hará que el recolector de basura se ejecute con frecuencia, lo que hace que su juego sea entrecortado e insensible. El mejor enfoque es crear un grupo de objetos una vez (básicamente una cola) y tomar objetos de la cola cuando los necesite y devolverlos a la cola cuando haya terminado. Para eso es la cola en la actividad principal. La otra cola es una cola de entrada en el hilo del juego que realmente contiene los eventos de entrada recibidos y que se procesa en el bucle del juego utilizando el método processInput.
La cola de grupo siempre tendrá un número fijo de objetos (especificado por la constante INPUT_QUEUE_SIZE que puede ser 30, por ejemplo) que se asignan en el método createInputObjectPool cuando se crea la actividad, mientras que la cola de entrada tendrá un número variable de eventos de entrada que son alimentados por la actividad y devueltos a la cola del grupo una vez que se procesan utilizando el método returnToPool. Estas colas son ArrayBlockingQueue s, que son colas normales (primero en entrar, primero en salir) implementadas utilizando una matriz (a diferencia de la lista vinculada, por ejemplo) que bloquearía, en circunstancias en que una cola normal se desbordaría y se desbordaría, hasta que la cola esté lista para el operación.