Como siempre, la arquitectura depende de sus requisitos. ¿Cuántas turbas vas a tener? ¿Qué tan compleja es su IA? ¿A qué reacciona? ¿Con qué frecuencia cambia su estado? Responda estas preguntas y comprenderá mucho mejor lo que desea y cómo obtenerlo.
En general, querrás tener al menos algún tipo de sistema de eventos. La IA generalmente se define en términos de eventos: "Cuando A sucede, haz B"; y si no tiene eventos en el código real, tendría que traducir de alguna manera estas definiciones.
En mi experiencia, puedes salirte con la implementación de un bucle simple cuando tienes pocos mobs realmente simples (al contrario de lo que parece sugerir la otra respuesta). Por ejemplo, en nuestro juego actual tenemos cientos de instancias pequeñas, cada una con 10 mobs como máximo. Y estas turbas son estúpidas; La IA del 99% de ellos se puede describir en una oración: "¿Estoy atacando a alguien? Si no, ataca al jugador más cercano". En este caso, un simple bucle es más que suficiente: dos veces por segundo buscamos un nuevo objetivo (y algunas otras cosas para los raros mobs "inteligentes"), y eso es todo.
Sin embargo, cuando tienes mobs más y / o más inteligentes, el enfoque ingenuo deja de funcionar. Para que la IA reaccione a algún estímulo, tendría que escribir un código que lo detecte dentro de su ciclo de AI. Por ejemplo: suponga que su mafia debe hacer algo "cuando es golpeado por un jugador". Con un enfoque de bucle, no hay una manera fácil de determinar que la mafia fue golpeada. Cuando la IA se está ejecutando, puedes comprobar que la salud de la mafia ha disminuido desde el último tic, o que la mafia está en la mira de alguien. Pero no puede detectar golpes reales sin recurrir a hacks, como guardar la información de cada golpe en algún lugar para que AI acceda más tarde.
En segundo lugar, siempre funciona un bucle ingenuo, pase lo que pase. Cuando tienes muchos mobs, quieres que la IA se ejecute lo más rápido posible ... y el código más rápido es el código que nunca se ejecuta. Si tienes mobs que no están activos, quieres que no ejecuten AI, o solo lo ejecuten esporádicamente (como en, la IA de la mafia errante solo debería ejecutarse cuando decida a dónde ir después).
Con el enfoque basado en eventos, puede hacer que sus otros subsistemas envíen eventos de IA siempre que sea conveniente, eliminando el problema de "detectar golpes". Por supuesto, algunos eventos aún requerirían la detección de código: el ejemplo más notorio es el evento de "enfoque". Y cuando no ejecuta su rutina de IA en un bucle cuando no sucede nada, gana rendimiento.
También puede usar un enfoque híbrido. En lugar de manejar los eventos de IA de inmediato, puedes meterlos en algún tipo de cola. Luego, cuando se ejecuta la rutina AI (en un bucle), elimina los eventos de esta cola y los maneja uno por uno. Con esta arquitectura, el rendimiento de la IA puede ser un poco más lento, pero es más predecible; Además, puede garantizar que toda la IA se ejecute en un solo hilo (que de lo contrario podría ser complicado). Este tipo de bucle también se puede acelerar fácilmente omitiendo algunos eventos (por ejemplo, cada iteración de IA solo maneja los tres eventos más recientes, descartando el resto). O los eventos podrían priorizarse, y los menos importantes se descartarían si se descubre que la IA está rezagada.
En general, el enfoque de "cola con eventos en cola" es probablemente el más flexible. Pero quiero reiterar: no lo elijas a ciegas como "el mejor". Piense primero en sus requisitos, y un enfoque más simple puede resultar mejor.
Dependerá de la cantidad de enemigos que tenga y de cuán activos sean.
Si tienes muchos enemigos, pero no hacen mucho la mayor parte del tiempo, un sistema de eventos podría ser mejor. Si tienes enemigos que generalmente están haciendo algo, el bucle puede funcionar mejor ya que elimina la complejidad del sistema de eventos y porque si los eventos estuvieran en su lugar, estarían disparando constantemente de todos modos.
fuente