RTS Game AI Thread

14

Tengo un proyecto para hacer un juego de estrategia en tiempo real desde cero. Todavía estoy en la etapa inicial de planificación, pero he estado programando un poco para ver la mecánica.

Sé programar. También tengo una buena idea de cómo estructuraré las clases de juego y la IA basada en reglas (máquina de estado) para el jugador de la computadora.

Quiero desarrollar Doctrinas, que darán un comportamiento específico a una unidad específica (pero se pueden usar en muchas unidades al mismo tiempo), como Scout, Seguir la ruta de la misión, mantener la posición (atacar a cualquier enemigo que se acerque o retirarse si está abrumado) , etc ...

Las doctrinas solo se aplicarán a las unidades, por lo que tendrá una perspectiva unitaria, y no estará al tanto de toda la situación del mapa.

La computadora AI analizará todo el mapa visible y decidirá qué soctrina asignar a cada unidad dependiendo de otro conjunto de reglas.

Estoy haciendo esto en C # con OpenGL.

Por ahora, no tengo mucho, solo algunas cosas en las pruebas antes de comenzar mi concepción principal. Tengo un bucle de juego donde sucederá todo el procesamiento del juego (donde llamaré movimiento de actualización, combate, renderizado, etc., uno tras otro), se llama muy a menudo si se produce el evento Application.Idle.

Ahora me preguntaba. Dado que habrá muchas cosas que procesar en el bucle del juego, ¿la IA de la computadora y las unidades deben seleccionar sus acciones en ese bucle o será demasiado lento?

Si quiero que todas las cosas sean simultáneas, ¿debo crear un hilo separado para la IA de la computadora? ¿O incluso un hilo separado para cada unidad?

No tengo mucha experiencia con subprocesos múltiples. ¿Cuál sería el mejor enfoque para esto?

Nate
fuente
No relacionado: ¿se considera Ogre3D en lugar de OpenGL?
En realidad, no, nunca escuché sobre eso. Estoy usando OpenGL porque eso es lo que me enseñaron en mis clases. ¿Ogre3D también puede hacer 2D? Supongo que sí, pero nunca lo sabemos ...
Sí, puede, incluso tiene su propio kit de herramientas GUI (cegui). Por ejemplo, TorchLight está construido con él. Puede ahorrarle tiempo porque se ajusta muy bien ALREDEDOR de OpenGL. ogre3d.org/tikiwiki/MOGRE
"O incluso un hilo separado para cada unidad" Diablos no. La sobrecarga de un hilo es demasiado grande. Por un lado, está la memoria reservada para la pila del subproceso (1 MB por defecto). Y los interruptores de hilo también son caros.

Respuestas:

3

¿Qué significa "desde cero"? ¿Puedes usar algo como XNA en su lugar con DirectX?

Debería renderizar algo entre 30 y 60 cuadros por segundo para tener un movimiento fluido. Realmente no hay necesidad de tener más fps.

Si renderizar + lógica toma menos de los 16 ms que le da 60 fps, entonces no debería haber necesidad de un hilo AI.

Si no tiene suficiente tiempo entre renderizar los cuadros, entonces tendrá que pensar con mucho cuidado sobre qué debe actualizarse cada cuadro y qué no.

Supongo que la parte de "doctrinas" debería ser lo más simple y eficiente posible para que pueda actualizarse cada cuadro, al menos para las unidades visibles y otras unidades cercanas. Las unidades que no influyen directamente en las unidades visibles se pueden actualizar con menos frecuencia (y, en consecuencia, con un mayor delta T).

La IA principal tiene más trabajo que realizar, ya que tiene que procesar todas las unidades en el mapa y descubrir una estrategia, por lo que debería requerir la mayor parte del tiempo de cálculo. Es el primer candidato para un hilo separado.

Tenga en cuenta que es posible que desee agregar otra capa entre los dos, algo así como una IA de nivel de escuadrón. Básicamente, la IA de cada unidad debe asegurarse de que la unidad responda "inteligentemente" a la situación inmediata, por lo que debe ser rápida y receptiva. El escuadrón AI es responsable de las acciones "inteligentes" de varias unidades, repartidas en varios segundos, como encontrar un puente si el escuadrón necesita cruzar un río. Y la IA principal debe dirigir las acciones de muchos escuadrones durante un largo período de tiempo.

Especialmente si no tienes mucha experiencia, no hagas hilos si no es necesario. Esto será complicado ya que es sin una carga adicional. Puede aprender el subprocesamiento múltiple como un proyecto separado o como una extensión de este una vez que esté en un estado de trabajo . ¡Buena suerte!


fuente
0

Tener un hilo separado para la IA. Pero no para cada unidad, ya que consumiría demasiados recursos del sistema operativo y la sincronización sería una pesadilla.

Asegúrese de que el hilo AI encuentre una oportunidad para ejecutar. No lo tomes a la ligera, si el hilo principal hace demasiadas cosas, ¡tal vez nunca encuentre esa oportunidad! Si simplemente le das mayor prioridad al hilo AI, entonces el juego deja de responder, lo cual es inaceptable.

Por lo tanto, seleccione cuidadosamente los puntos de sincronización y / o eventos en el bucle principal y permita que el hilo AI complete sus cálculos mientras el hilo principal se detiene. Por ejemplo, si la unidad de usuario ve otra unidad de IA, sincronícela para que su unidad vea una unidad actualizada y viceversa.


fuente
0

También estoy trabajando en un juego de estrategia en tiempo real desde cero. Todavía no lo he probado, pero mi idea era ejecutar la unidad AI en el bucle principal del juego para todas las unidades que actualmente son visibles para el jugador (en la parte de la pantalla que el jugador realmente ve o cerca del borde de esa pantalla ), ya que es más probable que el jugador mueva un poco la pantalla.

Las otras unidades se verifican en un hilo separado, y tengo dos prioridades: 1. Unidades que están en lugares que son visibles para el usuario si mueve la pantalla allí. 2. Unidades que se encuentran en áreas ocultas (aún no exploradas y "niebla de guerra").

Para las unidades en la prioridad de segundos, ejecuto el bucle con menos frecuencia y lo compenso moviéndolo retrospectivamente cuando sea necesario.


fuente
1
Suena muy complicado
Tu idea suena bien, excepto por la primera parte sobre mover unidades dentro y fuera del circuito principal del juego. Toda la IA debe hacerse en su propio ciclo, donde puede seleccionar omitir el ciclo cada xiteración en unidades de baja prioridad.
Olhovsky
0

Ya sea que necesite multiproceso o no, puede ser una buena idea preparar la IA para que sea multiproceso.

Su hilo principal actualizará el mundo, marcará la física, etc., y luego completará una estructura de datos que representa la visión del mundo de la IA: posición de las unidades, estado de los recursos, etc. Esta estructura de datos almacenará en caché los sistemas principales, más bien que simplemente mantener punteros a ellos. Esto a veces se llama un punto de sincronización.

Pase esta estructura de datos a la IA y solo permita que razone sobre el contenido de esta estructura. Si encuentra que la IA necesita más información, agréguela a la estructura. En el lenguaje AI, esto a menudo se denomina pizarra, pero también podría denominarse caché. Nunca permita que la IA escriba en el caché, la salida debe venir a través de una estructura de datos separada.

Esta configuración te permitirá paralelizar el juego porque la IA ya no tiene ninguna dependencia directa de los otros sistemas del juego. Esos sistemas no necesitan ser seguros para subprocesos y nunca debe obtener bloqueos. Puede ejecutar de forma segura el renderizador o algo mientras la IA se aleja.

Como beneficio secundario, en el futuro puede ampliar el caché al descomponer la información que obtiene de los otros sistemas a lo largo del tiempo, simulando incertidumbre en lugar de conocimiento exacto.

tenpn
fuente