2011-12-09 16 views
5

Estoy trabajando en un juego de estrategia por turnos en Java (en el marco de Android). Siguiendo la estructura en Beginning Android Games, tengo un hilo de renderizado y un hilo de interfaz de usuario. El hilo de renderizado actualiza repetidamente el estado mundial y luego vuelve a dibujar el mundo. Cuando el usuario interactúa con la pantalla, la GUI envía acciones al mundo (patrón de comando). Ahora estoy agregando jugadores AI, y aquí está mi plan:¿Cómo debo manejar la comunicación entre los hilos AI y el lazo principal del juego?

Cada jugador AI tendrá una IA que se ejecute en un hilo separado.

Cuando el mundo se actualiza en un turno AI, comprueba si hay una acción pendiente. Si es así, lo ejecuta. Luego le pide al jugador de IA su próxima acción.

El reproductor AI enviará la solicitud de una acción al hilo AI y luego regresará.

Eventualmente, la IA generará una acción y la publicará de nuevo en el Mundo, que la verá en la próxima actualización.

dos preguntas:

1) ¿Tiene este diseño parecen sonido?

2) ¿Cómo manejo la comunicación hacia y desde el hilo AI? Si tengo el hilo AI llame a world.queueAction (acción), parece que funcionaría, pero si el hilo de renderizado llama a ai.chooseAction (mundo) que ejecutará la acción eligiendo en el hilo de renderizado, que no es lo que quiero .

+0

No está haciendo lógica mundial en el hilo de renderizado, ¿verdad? – BRFennPocock

Respuesta

4

Tendría un ExecutorService para las IA y le agregué tareas para las cosas que desea que realice. Para la interfaz de usuario puede tener una cola de cosas que han cambiado y es posible que deba volver a dibujarse. Me sentiría tentado de usar un solo hilo para todas las IA hasta que sepas que esto ayudaría. La mayoría de los dispositivos Android solo tienen 1-2 CPU de todos modos.

+0

Está bien, entonces la clase de inteligencia artificial implementará Runnable, y su método run() calculará el próximo movimiento basado en el estado del nivel actual y luego pondrá una nueva acción en cola en el mundo. AIPlayer tendrá un ExecutorService estático. Cuando se invoca chooseAction() en un objeto AIPlayer, actualizará su instancia de AI con el estado de nivel actual, y luego le indicará al servicio del ejecutor que ejecute su instancia de AI. – Perikles

+1

Parece que funciona, ¡gracias! – Perikles

1

si he entendido bien:

  • Usted tiene un hilo de procesamiento. Presumiblemente, esto se ejecuta a la velocidad de cuadro de la pantalla.
  • Tiene un hilo de "lógica mundial". Esto se ejecuta a partir de un temporizador predecible.
    • Tiene física general, entrada de jugador u otras acciones en un hilo;
    • y un hilo separado por cada personaje AI

Parecería que usted podría funcionar con seguridad cada uno de los hilos de lógica AI como Future y recoger sus resultados juntos después de hacer cualquier otra cosa que el "mundo "hilo está haciendo, en cada marco.

+0

De hecho, es así: el hilo de la interfaz de usuario de Android (registra el toque del usuario y otros eventos), el hilo de procesamiento (dibuja la pantalla y actualiza la lógica mundial, se ejecuta a la velocidad de fotogramas). Así que no hay un 'tic' de reloj en las actualizaciones mundiales. Tal vez debería haber? – Perikles

+0

Suponiendo, entonces, que se trata de un búfer de renderizado fuera de la pantalla o algo así? ¿No tienen que suceder todas las actualizaciones de UI en el único hilo de Android? (Lo hicieron en 1.5, pero estoy desactualizado, lo sé ...) – BRFennPocock

+0

Tiene un bucle que hace las actualizaciones lógicas mundiales, convierte el mundo en un búfer, y luego bloquea el lienzo, procesa el búfer y desbloquea el lienzo, luego de vuelta a la cima. – Perikles

2

¿Estás seguro de que el sistema podrá manejar una gran cantidad de hilos? Tenga en cuenta que el número "óptimo" de subprocesos en ejecución suele ser n + 1, donde n es la cantidad de núcleos que tiene el sistema. Si esto se ejecuta en un teléfono, no va a ser menos de los que están disponibles, aunque menos que esté ejecutando más de 10 usted puede estar bien ...

Para la conexión entre su juego y su IA, se puede ser útil considerar la diferencia entre el jugador (humano) y las IA: solo hay una distinción importante: una es una computadora y la otra no.Sería mejor enviar las acciones que las IA llevan exactamente a la misma cola (o a través del mismo mecanismo general) que los jugadores humanos (por lo tanto, llama al world.queueAction(action);). También hace que el intercambio entre IAs y jugadores humanos sea más simple, ya que tu código de actualización mundial no necesita saber la diferencia ...

Supongo que ya tienes algún tipo de evento para notificar al jugador/actualizar la pantalla cuando es el turno del jugador humano. Haga exactamente lo mismo con los hilos de inteligencia artificial: haga que escuche el evento apropiado "Es su turno", haciendo que finalice (estas iteraciones) los cálculos y coloque una acción en la cola. Tenga en cuenta que esto debe hacerse desde el hilo 'actualización mundial'; el hilo de renderizado debe estar únicamente relacionado con la representación de la salida en la pantalla (y solo se refiere tangencialmente a la entrada del reproductor).

Cuestiones relacionadas