¿Cómo gestionar todos los objetos NPC / AI en el servidor?

8

Estoy escribiendo un MMO simple, y actualmente tengo la arquitectura servidor-cliente para que varios usuarios se vean y puedan moverse juntos ... ahora es el momento de agregar enemigos.

Me preguntaba si alguien tenía enlaces a artículos que discutieran cómo manejar mejor los cientos de objetos NPC que necesitan ser administrados en el mundo. He hecho algunas búsquedas y no pude encontrar mucha información sobre cómo se hace esto normalmente.

Se me ocurren dos métodos para estructurar la implementación:

  1. Mantener todos los objetos NPC instanciados en una lista y hacer que un Hilo NPC los recorra secuencialmente y vea si cada uno tiene alguna lógica que deba procesarse y realice las acciones necesarias. No estoy seguro de si el rendimiento de este diseño sería suficiente?
  2. Sistema basado en eventos. Cree un método en la clase NPC que procese AI / Logic en él, haga que se llame a este método cuando se señale un evento asociado, ya sea en un temporizador para la funcionalidad de IA no interactuada (como deambular) o señalice el evento externamente desde el paquete controlador (jugador que se mueve cerca, o jugador que ataca dentro del alcance).

¿Alguno de estos enfoques es el correcto? ¿Qué otros métodos existen para hacerlo?

dgo
fuente

Respuestas:

5

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.

No importa
fuente
y solo para completar esta respuesta, siempre puede agregar mobs o eliminarlos de su ciclo de verificación. p.ej. cuando no hay nadie para observar lo que hace una mafia, simplemente no es lógico hacer todo lo que el NPC haría en ese momento. para que pueda filtrar fácilmente muchos mobs y simplemente verificar si los más importantes (generalmente los que están lo suficientemente cerca de los jugadores) necesitan alguna actualización
Ali1S232
¿Es una "mafia" un grupo de enemigos o un solo enemigo?
Richard Marskell - Drackir
"mafia" es un solo enemigo. El término fue acuñado por Richard Bartle en MUD1, y es la abreviatura de "móvil", porque los mobs se mueven un poco, en lugar de otros objetos.
importa
2

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.

Nate
fuente