La mejor arquitectura de juego de igual a igual


10

Considere una configuración donde los clientes del juego:

  1. tener recursos informáticos bastante pequeños (dispositivos móviles, teléfonos inteligentes)
  2. están todos conectados a un enrutador común (LAN, punto de acceso, etc.)

Los usuarios quieren jugar un juego multijugador, sin un servidor externo.

Una solución es alojar un servidor autorizado en un teléfono, que en este caso también sería un cliente. Considerando el punto 1, esta solución no es aceptable, ya que los recursos informáticos del teléfono no son suficientes.

Entonces, quiero diseñar una arquitectura punto a punto que distribuya la carga de simulación del juego entre los clientes. Debido al punto 2, el sistema no necesita ser complejo con respecto a la optimización; La latencia será muy baja. Cada cliente puede ser una fuente autorizada de datos sobre sí mismo y su entorno inmediato (por ejemplo, viñetas).

¿Cuál sería el mejor enfoque para diseñar tal arquitectura? ¿Hay algún ejemplo conocido de un protocolo de igual a igual de nivel LAN?

Notas:

Aquí se abordan algunos de los problemas , pero los conceptos enumerados allí son de demasiado alto nivel para mí.

Seguridad

Sé que no tener un servidor autorizado es un problema de seguridad, pero no es relevante en este caso ya que estoy dispuesto a confiar en los clientes.

Editar:

Olvidé mencionar: será un juego bastante rápido (un juego de disparos).

Además, ya he leído sobre arquitecturas de redes en Gaffer on Games .

Respuestas:


10

Eche un vistazo a este artículo sobre la arquitectura de redes de Age of Empires II.

Lograron crear un juego multijugador que funcionó muy bien en un Pentium 90 con 16 MB de RAM y una conexión de módem de 28.8 kB / s. Lo hicieron haciendo que cada jugador ejecutara su propia simulación, pero sincronizara sus comandos.

Tienen algunos trucos inteligentes allí, lo recomiendo encarecidamente.


5

Lo hice para un juego de carreras comercial de PSP, que funcionó tanto en una red ad hoc como a través de un punto de acceso inalámbrico. (O a un servidor estático en Internet, si lo desea)

Debido al punto 2, el sistema no necesita ser complejo con respecto a la optimización

En mi experiencia, esto no es cierto. Los dispositivos inalámbricos (especialmente los portátiles pequeños) no son como las computadoras con conexiones de red cableadas: los teléfonos inteligentes y las consolas de juegos inalámbricas tienden a tener interfaces de red lentas para fines de juego.

No me malinterpreten: su rendimiento suele ser bueno (es decir, la cantidad de datos por segundo; excelente para la transmisión de películas o etc.), pero la latencia en la entrega de un paquete en particular puede ser extremadamente mala, y puede serlo. Es muy variable que sea difícil incluso estimar cuánto tiempo llevará entregar un paquete individual. Esta variación empeora aún más a medida que se agrupan más dispositivos inalámbricos en un área general, ya que sus señales comienzan a interferir entre sí. Como resultado de esto, pasé mucho de mi tiempo reduciendo la cantidad de paquetes que debían enviarse, por lo que tendríamos menos colisiones de paquetes. (Tenga en cuenta que esto es un problema menor en el caso de que esté involucrado un punto de acceso de red alimentado, en lugar de hacer que los dispositivos se comuniquen entre sí directamente a través de una red ad hoc)

Como ejemplo de este tipo de optimización, nuestro juego de carreras tuvo lugar en un mundo que tenía semáforos. Miles de ellos Y teníamos que asegurarnos de que sus señales estuvieran sincronizadas entre todos los jugadores en una sesión de red. En lugar de tratar de enviar paquetes diciéndoles a todos qué luces estaban en qué estado, definimos un horario estático para todos los semáforos, y luego nos aseguramos de que todos los clientes estuvieran de acuerdo con el "tiempo de juego" actual. Como todos sabían el tiempo del juego, y todos los estados de los semáforos podían determinarse a partir del tiempo del juego, sincronizamos todos esos datos de estado sin enviar ningún dato especial. Este cambio hizo una gran diferencia para nuestro rendimiento de red.

Dicho esto, establecer una sincronización de reloj confiable entre múltiples dispositivos inalámbricos (con tiempos de ping muy variables debido en gran parte a la pérdida de paquetes) fue un gran desafío. Feliz de hablar más sobre eso si tiene interés.

Cada cliente puede ser una fuente autorizada de datos sobre sí mismo y su entorno inmediato (por ejemplo, viñetas).

Esto es lo que hicimos, y funcionó bien para nosotros en nuestra situación (automóviles). La parte problemática, por supuesto, es cuando un objeto deja de estar más cerca del jugador 'a' que del jugador 'b', y su propiedad, por lo tanto, se transfiere de un jugador a otro.

Esta es en realidad una negociación sorprendentemente compleja entre jugadores, donde el juego 'a' propone el juego 'b': "Creo que este objeto está más cerca de ti. Debes tomar el control de él". Y luego el juego 'b' puede aceptar o rechazar, en función de su propia visión de la situación. Las diferencias en el estado percibido del juego entre 'a' y 'b', y el cambio en el tiempo entre el envío y la recepción de la solicitud y la respuesta hacen que esta sea una pequeña negociación particularmente desagradable para ser confiable, y puede degenerar fácilmente en un juego de "papa caliente", con propiedad de objetos que se balancea continuamente entre múltiples jugadores. E incluso cuando funciona correctamente, cuando se ve desde el punto de vista del juego 'c', allí '

Mi intuición es que este tipo de enfoque de "propiedad de objetos" probablemente sea demasiado engorroso para objetos pequeños y de corta duración como las balas. Lo usamos para autos de tráfico y corredores de IA, que tendieron a vivir en la simulación durante un tiempo relativamente largo. Parece que un enfoque más eficaz, si estás dispuesto a confiar en los clientes, sería hacer que el juego de cada jugador sea dueño de su posición y sus proyectiles, y declarar cuándo ese jugador ha sido golpeado por el proyectil de otra persona. (Entonces, como "juego A", soy responsable de decir dónde están los proyectiles del jugador A y del jugador A, pero el jugador B es responsable de decir si he golpeado al jugador B). Con un buen cálculo de los muertos, debería ser capaz de obtener un comportamiento bastante razonable de un sistema como este.


1

Le recomiendo que use la arquitectura de paso a paso de bloqueo de igual a igual.

Comienza contando los fotogramas de tu juego después de que comienza el juego. Un cliente procesa el primer cuadro y luego envía el mensaje listo a otros clientes y espera recibir el mensaje listo de otros clientes.

Ahora todos los clientes pueden ir para el segundo cuadro. Renderice el marco, envíe y reciba comandos, actualice el mundo, actualice la física y ... después de eso envíen mensajes listos el uno al otro.

Esta solución es muy buena para los juegos de LAN y todos sus clientes estarán sincronizados.

Con este tipo de red, puede estar seguro de que todos sus clientes están sincronizados para que pueda probar la mejor manera que se adapte a sus necesidades.

La primera forma es solo enviar las entradas a otros y cada cliente simula la ejecución, el disparo, la detección de colisiones, etc. La segunda forma es que cada cliente envía la información sobre su personaje a otros, como la posición, la rotación, el estado, el cuadro de animación, etc. calcula sus cosas y las envía a través de la red, pero la primera forma es más segura.


1
Esta respuesta parece ser sobre el ciclo del juego. Creo que el OP pregunta sobre el sistema de distribución de carga; específicamente, quién simula qué y cómo se comunican los clientes. ¿Podrías entrar en más detalles? También estoy interesado en este problema.
Wackidev

@Wackidev con este tipo de red puede estar seguro de que todos sus clientes están sincronizados para que pueda probar la mejor manera que se adapte a sus necesidades. La primera forma es solo enviar las entradas a los demás y cada cliente simula la ejecución, el disparo, la detección de colisión, etc. La segunda forma es que cada cliente envía la información sobre su personaje a otros, como la posición, rotación, estado, marco de animación, etc. calcula sus cosas y las envía a través de la red, pero la primera forma es más segura.
kochol

Así que por favor ponga eso en su respuesta. En este momento no creo que responda la pregunta. Además, elimine el primer comentario duplicado. Gracias. En cuanto a la idea en sí, ¿la primera opción que enumeró no requiere que la simulación sea determinista?
Wackidev
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.