¿Qué datos deben almacenarse en caché en un servidor multijugador, en relación con la IA y los jugadores?

8

En un lugar virtual, totalmente controlado por la red, con un número arbitrario de jugadores y un número arbitrario de enemigos, ¿qué datos deben almacenarse en la memoria caché del servidor para optimizar la simulación de AI sin problemas?

Intentando explicar, digamos que el jugador A ve al jugador B a E, y el enemigo A a G. Cada uno de esos jugadores, ve al jugador A, pero no necesariamente el uno al otro. Lo mismo se aplica a los enemigos. Piense en esta pregunta desde una perspectiva de arriba hacia abajo, por favor.

En muchos casos, por ejemplo, cuando un jugador dispara su arma, el servidor maneja el sonido como una "señal" radial que cualquier otra entidad a su alcance "escucha" y reacciona.

Hacer estas búsquedas todo el tiempo por un área completa, que posiblemente contenga muchos jugadores y enemigos no relacionados, parece ser un problema, cuando el presupuesto para cada agente de IA es tan pequeño.

¿Debería cada entidad almacenar en caché lo que entra y sale de su radio de conciencia? ¿Hay una excelente manera de rastrear las entidades cercanas sin inundar la memoria con tales cachés?

¿Qué pasa con otros problemas relacionados con la IA que pueden surgir, después de asumir que el anterior funciona bien? Estamos hablando de entornos con posiblemente cientos de enemigos, un enjambre.

Grimshaw
fuente
Depende bastante del número de jugadores y de la IA y demás en el juego. Por ejemplo, los MMO usan cosas como gráficos de escenas para buscar rápidamente quién está cerca de lo que mencionas anteriormente, mientras que un juego de FPS que solo rastrea quizás 30 cosas en total, sería excesivo y es probable que solo una lista vinculada de 30 entidades suficiente. ¿Puedes ser un poco más específico en tu configuración? Con solo 5 jugadores y 7 AI, diría que no necesitas hacer nada especial además de tener las 13 entidades cargadas en la memoria de forma normal.
James
Un caso absolutamente normal del mundo del juego es como tal: más de 20 regiones, como en la ciudad más los alrededores. Cada región es lo que estamos considerando aquí y se subdivide recursivamente por áreas, en forma de gráfico de escena como usted dijo. Un área puede ser aún más grande que la conciencia de la entidad, y puede contener perfectamente 100 enemigos o más, y CUALQUIER número de jugadores. Claro que hay áreas vacías, pero también hacinamiento
Grimshaw
1
Estoy bastante interesado por los comentarios sobre esta pregunta.
Coyote

Respuestas:

7

Hay varias formas de hacerlo, pero dependen de donde sea que tenga una gran cantidad de interacciones o una población muy densa.

Desafortunadamente, si desea que su simulación mantenga una buena precisión, deberá manejar la mayoría de los eventos generados por todos los actores y encontrar a todos / la mayoría de los actores que requieren notificación.

Cheap zona de colisiones

Con respecto al problema de las áreas de conciencia, puede resolverlo mediante la detección de colisión simple.

En un mundo 2D, la detección de colisiones en círculos es "barata". Por ejemplo, la operación para detectar si un punto está en un círculo solo requiere 2 restas, 2 multiplicaciones y una suma. No necesita hacer la raíz cuadrada, ya que puede almacenar y comparar el radio cuadrado de su área con la distancia cuadrada directamente.

Si usa el círculo 2D en un mundo 3D, básicamente funcionará como un cilindro. Puede ser una forma conveniente de crear áreas si la altura no es muy importante.

Radio orientado a eventos

Si el volumen de eventos (tiroteo, movimiento ...) es bajo, puede intentar detectar a cada actor afectado por cada evento. Sus eventos generarán áreas (donde se pueden escuchar).

Este es el método más simple de implementar, también es el más flexible, ya que puede detectar impactos de bala / proyectil que se originan de actores fuera de un área de conciencia.

Por otro lado, una vez que aumenta el volumen de eventos, es posible que deba reducir el número de eventos que activan los escaneos de área o el número de actores escaneados por evento.

-> También puede crear pequeñas zonas (eventos) donde todos los eventos se registran juntos y se procesan en grandes cantidades (es decir, 2 impactos de bala y un paso de pie que ocurre en una zona usará solo un escaneo y se enviará a todas las entidades afectadas). <-

Áreas orientadas al actor

Puede utilizar el principio del "área de conciencia". Es decir, si un actor colisiona con el área de conciencia (círculo) de otro actor, simplemente agregue el actor colisionador a una lista de actores potencialmente interactivos. Dependiendo de cómo esté construido su motor, puede registrarse para recibir mensajes de sonido y otros eventos originados por los actores de la lista.

Para verificar el contacto visual, también puede hacer sus escaneos visuales solo en la lista de actores registrados.

No tiene que verificar si el área de conciencia cambia cada tic. Puedes hacerlo de vez en cuando, cada 5 a 30 tics, por ejemplo.

Si las listas comienzan a crecer, puede limitarlas a un tamaño máximo. Pero luego tendrá que priorizar a los actores para agregar / intercambiar en las listas.

Enfoque mixto

Puedes mezclar ambos enfoques. Puede registrar actores en áreas de conciencia para eventos como pasos de pies, narices de motores, etc. Y otros eventos (impactos de proyectiles, explosiones, etc.) pueden activar escaneos en función de su importancia. Hay muchas más posibilidades de que alguien escuche una explosión de granada que un impacto de bala, por lo que la explosión de la granada debería desencadenar una exploración más extensa que el impacto de la bala.

Recomiendo que comience a implementar el radio de eventos primero. Una vez que esto funcione y pueda reducir / aumentar la precisión de este método a voluntad, puede comenzar a implementar las áreas de conocimiento del actor. De esta manera, podrá comenzar a mover algunos eventos al segundo sistema.

Grupos de contexto

No todos los actores deben ser notificados de todos los eventos. Por ejemplo, una torreta antiaérea no necesita ser notificada sobre impactos de bala y pasos a su alrededor, incluso la presencia de unidades terrestres podría ignorarse para algunas unidades.

Si encuentra muchos de estos casos especiales, puede crear diferentes grupos de áreas de conciencia. Un actor puede activar su área de conciencia en múltiples grupos. Por ejemplo, es posible que desee que sus unidades terrestres reaccionen a las unidades terrestres solo mientras que algunas unidades equipadas con misiles y láser también podrían reaccionar a las unidades aéreas. Las aeronaves nunca necesitan ser notificadas sobre impactos en el suelo que no sean explosiones ...

Por supuesto, no necesita crear múltiples "listas" para los grupos. Simplemente puede usar una máscara de bits y establecer la máscara correcta para cada actor / área. De esta manera puede filtrar con un simple o antes de verificar la distancia.

Agregación

Si ve que las listas en cada área de conciencia crecen y la memoria es escasa, puede agregar áreas de conciencia para grupos de enemigos (equipos, escuadrones, pelotones, bandadas, enjambres ...) siempre que permanezcan cerca el uno del otro. De esta manera, un escuadrón completo puede registrarse para eventos u otros actores / grupos que ingresan a su área de conciencia.

Básicamente, la entidad del grupo se convierte en un sustituto / proxy para todos los escaneos, mientras que todos los miembros del grupo se eliminan de los grupos.

Este principio también se puede aplicar a todas las unidades dentro de un vehículo.

Activaciones de proximidad

Si el servidor está realmente superpoblado con bots (y realmente necesitas mantenerlos a todos vivos), entonces solo puedes activar la conciencia / IA en aquellos dentro de un "área de activación especial alrededor de cada jugador". De esta forma, los bots (o grupos) dentro de una o más áreas de activación se mantienen activados y su área de conciencia activa (en el grupo de colisión). De lo contrario, su área de conciencia se elimina del grupo de áreas activas.

La frecuencia con la que esas "áreas de activación" buscan "áreas de conciencia" puede variar según la velocidad del jugador. Un jugador que viaja a mayor velocidad activará más activaciones que un jugador que acampa en una zona (necesaria al menos para activar bots itinerantes y desactivar bots que abandonan el área).

También puede desactivar el área de activación de un jugador si aborda un vehículo y asignar un área de activación al vehículo si no tiene uno. De esta manera, 10 jugadores que viajan en el mismo vehículo no necesitan tener 10 áreas de activación.

Delegación

Si no temes a los tramposos y a otros alborotadores, puedes delegar parte de la detección de eventos en la aplicación cliente.

El servidor puede enviar periódicamente una lista de actores cercanos (bots y jugadores) que serán notificados por las aplicaciones del cliente. La aplicación cliente deberá realizar el escaneo y la detección de eventos para todos los eventos generados por el reproductor. Por ejemplo, puede enviar la lista de actores para notificar sobre un disparo, un impacto de bala o pasos de pie.

Esta es una opción, puede ser válida dependiendo del tipo de juego que estés haciendo. Esta es una idea teórica y no recomendaría hacerlo hasta que tenga control total sobre los clientes delegados (servidores bot o clientes seguros).


Espero que esto ayude.

Coyote
fuente
Su respuesta parece definir la mayoría de los métodos que existen, ¡fantástico! Hacer una combinación de todo parece una buena opción, para una aplicación tan crítica de rendimiento, todo debe hacerse en detalle, evitando excesos aquí y allá. Además, realmente creo que si el cliente tiene autoridad sobre CUALQUIER COSA, puede y será engañado: P
Grimshaw
Sí ... pero si puede delegar algunas cosas en el cliente ahora podrá delegar en servidores secundarios más adelante si lo desea, restringiendo la delegación solo a los servidores y deshabilitándola en los clientes. Sin embargo, es solo una idea :)
Coyote
Es una buena idea, pero los jugadores siempre explotarán cuando sea competitivo ... Estoy más a favor de usar el poder de procesamiento del cliente para dulces y cosas para mejorar la experiencia, el sonido, los gráficos, etc. El servidor no necesita rastrear todo, algunos cosas que el cliente puede asumir sin permitir trampas. De todos modos, muchas gracias por la respuesta, nuevamente, ¡ayudará a equilibrar las cosas!
Grimshaw