redes multijugador con física

12

Tengo curiosidad por saber cómo se implementan las redes multijugador con física en los juegos de carreras. Tenemos un mundo físico con múltiples vehículos de rápido movimiento controlados por diferentes personas. Digamos que los vehículos tienen armas y pueden dispararse entre sí (Twisted Metal, Vigilante v8)

Estoy ansioso por golpes y colisiones. Servidor autorizado o una mejor alternativa?

Vitali Kotik
fuente

Respuestas:

5

Por lo general, se utiliza un servidor que almacena el estado de "verdad" que se comparte periódicamente con los clientes. Las colisiones ocurren independientemente en Clientes y Servidores, con los estados de los Clientes estimados a partir de los estados anteriores utilizando un proceso similar a lo que generalmente se llama Dead Reckoning . Cuando un estado del Servidor llega a un Cliente, si hay diferencias, el Cliente realiza una transición desde su estado actual al que acaba de recibir principalmente a través de la interpolación.

Sin embargo, con muchas colisiones de objetos puede ser un problema real, por lo tanto, lo que comúnmente se hace es mantener el tiempo simulado de los Clientes un poco por detrás del tiempo simulado del Servidor para permitir varios grados adicionales de flexibilidad. Este artículo sobre el código de red de Source Engine de Valve es bastante explicativo. Además, si todavía no está decidido sobre qué middleware / biblioteca de redes usar, le sugiero que busque en RakNet y su componente "ReplicaManager3" .

Neenster
fuente
2

Hay varias cosas que puedes hacer.

  1. Puede centralizar todos los objetos físicos en el servidor y sincronizar las coordenadas con los objetos de los jugadores en todos los clientes. Esto es lo más fácil y funciona sin muchos defectos, sin embargo, utiliza muchos recursos y requiere mucho ancho de banda. Puede optimizar el uso del ancho de banda enviando solo valores al reproductor de otros reproductores que se encuentren dentro de un determinado radio.

  2. Puede hacer lo que mencionó Neenster y hacer que el servidor y los clientes simulen la física, de vez en cuando el servidor corregirá a los clientes. Esto significa que todos los clientes calculan su propia física para cada jugador, y usted sincronizaría los eventos de pulsación de teclas en el servidor, dando la trayectoria de cada jugador en cada cliente. Cada 5 segundos, el servidor transmite su simulación física y todos los clientes aceptan el cambio. Esto puede crear ligeras compensaciones que pasan desapercibidas la mayoría de las veces, pero durante el retraso de la red y la pérdida de paquetes (inevitable con UDP de alto tráfico) notará que su jugador y / u otros jugadores parpadean en la pantalla y cambian de posición rápidamente y entrecortada (es que ¿palabra?).

  3. Puede hacer que cada cliente calcule su propia física y sincronice sus coordenadas. Esto hace que sea difícil simular la física en objetos compartidos entre clientes. Es un concepto bastante complejo de implementar si desea hacer algo elegante, porque cierto objeto no necesariamente pertenece a ningún cliente.

El primero es probablemente el más fácil y debería permitirte tener alrededor de 4-5 jugadores con poco retraso. Se requeriría que cada partido tenga su propio servidor. Si está haciendo coincidencias LAN, este es sin duda el camino a seguir.

El segundo es probablemente el más práctico, sin embargo, puede ser difícil de implementar. También es bastante ingenioso ejecutar simulaciones físicas en el servidor. Si tiene servidores centralizados, probablemente necesite equilibrar la carga en varias máquinas, tal vez permita 10 coincidencias por servidor, cargue nuevas coincidencias en el servidor con la menor cantidad de coincidencias.

El tercero es definitivamente el menos estresante en el servidor, y es probablemente la mejor solución si está haciendo un esquema de red de igual a igual. Como mencioné, puede ser difícil sincronizar objetos que no sean su objeto de jugador porque esos objetos también pueden ser alterados por otros clientes.

No puedo decirte cuál usar porque no sé cómo funciona tu juego. Todo lo que puedo hacer es darte los hechos. Si tiene más preguntas, no dude en comentar.

tsturzl
fuente
Sugieres que dejar que los clientes hagan su física es una solución aceptable, pero no te identificaste con las trampas.
cubuspl42
@ cubuspl42 Por el esfuerzo de permanecer en el tema, omití detalles. Creo que el OP puede explorar la solución más a fondo para explorar posibles formas de mitigar las trampas.
tsturzl
Una de ellas es permitir que la desviación de lo que proporciona cada cliente se limite a un umbral. Por ejemplo, la mayoría de los clientes dicen que un objeto dado se encuentra en la posición 5,8 o 6,9, pero uno informa 12,19 como la coordenada, que podría caerse de un umbral en comparación con la cantidad que se desvía de los otros clientes. Esta es solo una solución parcial, pero la mayoría de los juegos solo ofrecen soluciones parciales para hacer trampa, de ahí por qué todavía sucede. Esta solución no significa que están haciendo trampa, pero significa que su posicionamiento necesita ser corregido y les parecerá un retraso.
tsturzl
Bueno, estoy un poco en desacuerdo. Algunos tipos de trampas son reparables, otros no. Por ejemplo, en mi opinión, es un mal diseño del juego si uno puede hacer un speedhack para un tirador en línea competitivo. O algún truco loco que te permite volar alrededor del mapa con un modo divino y munición infinita (creo que sucedió en Crysis 1 en algún momento). Estos son reparables, solo diseña tu juego correctamente. Cosas como wallhack es casi inamovible (requeriría enormes recursos del servidor). Aimbot es prácticamente inamovible. Su solución # 3 aumenta el riesgo de este peor tipo de trampas.
cubuspl42
@ cubuspl42 Creo que te estás perdiendo la idea de lo que es un ejemplo. La opción 3 puede evitar exactamente el problema del que está hablando. Por lo general, tendrá un TCP que comparte la velocidad, y luego puede verificar fácilmente la velocidad entre los clientes y formar un consenso, también puede hacer algunos cálculos matemáticos simples para determinar si las coordenadas de UDP son plausibles dada la velocidad proporcionada suponiendo que sus clientes tengan reloj sincronizado (se puede establecer en la conexión desde el reloj HW).
tsturzl