networking - test - Lidiar con la latencia en juegos en red
tengo buen internet pero mucho ping (5)
Estoy pensando en hacer un juego en red. Soy un poco nuevo en esto, y ya me he encontrado con muchos problemas tratando de armar un buen plan para calcular el tiempo y la latencia de la red, así que me encantaría ver buena literatura sobre el tema. Describiré los métodos que he considerado.
Originalmente, acabo de enviar la entrada del jugador al servidor, simulé allí y transmití los cambios en el estado del juego a todos los jugadores. Esto hizo que hacer trampa fuera difícil, pero bajo condiciones de alta latencia era un poco difícil de controlar, ya que no se ven los resultados de sus propias acciones de inmediato.
Este artículo de GamaSutra tiene una solución que ahorra ancho de banda y hace que la entrada local parezca fluida al simular también en el cliente, pero parece echar a perder las trampas de la ventana. Además, no estoy seguro de qué hacer cuando los jugadores comienzan a manipular el entorno, empujando rocas y cosas por el estilo. Estos objetos previamente neutros se convertirían temporalmente en objetos sobre los que el cliente debe enviar PDU, o quizás varios jugadores a la vez. Cuyas PDU ganar? ¿Cuándo dejarán de seguir los objetos el seguimiento doble de cada jugador (para comparar con la versión estimada)? El cielo prohíbe que dos jugadores participen en una partida de sumo (por ejemplo, comiencen a empujarse mutuamente).
Este bit de gamedev.net muestra la solución de gamasutra como inadecuada, pero describe un método diferente que realmente no soluciona mi ejemplo colaborativo de empuje de bloques. La mayoría de las otras cosas que he encontrado son específicas para los tiradores. Me encantaría ver algo más orientado a los juegos que juegan como SNES Zelda, pero con un poco más de física / impulso involucrados.
- Nota: No estoy preguntando sobre la simulación de física aquí - otras bibliotecas tienen eso cubierto. Solo estrategias para hacer que los juegos sean fluidos y reactivos a pesar de la latencia de la red.
Consulte los temas de educación de Networking en el sitio web de XNA Creator''s Club. Se profundiza en temas como la arquitectura de red (peer to peer o cliente / servidor), Predicción de red, y algunas otras cosas (en el contexto de XNA, por supuesto). Esto puede ayudarlo a encontrar las respuestas que está buscando.
http://creators.xna.com/education/catalog/?contenttype=0&devarea=19&sort=1
Encuentro este blog de física de red publicado por Glenn Fiedler, y más aún la respuesta / discusión debajo de él, impresionante. Es bastante largo, pero vale la pena.
En resumen
El servidor no puede seguir el ritmo de la reiteración de la simulación siempre que se recibe información del cliente en una simulación de física de juego moderna (es decir, vehículos o dinámica de cuerpo rígido). Por lo tanto, el servidor ordena a todos los clientes latencia + jitter (tiempo) antes del servidor para que todos los paquetes entrantes entren en JIT antes de que el servidor los necesite.
También brinda un resumen de cómo manejar el tipo de propiedad que está solicitando. ¡Las diapositivas que mostró en GDC son increíbles!
En hacer trampa
El propio Sr. Fiedler (y otros) afirman que este algoritmo sufre de no ser muy a prueba de trampas. Esto no es verdad. Este algoritmo no es menos fácil o difícil de explotar que la predicción tradicional de cliente / servidor (vea el artículo sobre la predicción tradicional de cliente / servidor en la respuesta de @CD Sánchez ).
Para ser absolutamente claro: el servidor no es más fácil de engañar simplemente porque recibe el posicionamiento físico de la red justo a tiempo (en lugar de x milisegundos más tarde que en la predicción tradicional). Los clientes no se ven afectados en absoluto, ya que todos reciben la información posicional de sus oponentes con la misma latencia que en la predicción tradicional.
No importa qué algoritmo elijas, es posible que desees agregar protección contra trampas si estás liberando un título importante. Si es así, sugiero que se agregue el cifrado contra los bots títeres (por ejemplo, un cifrado de flujo XOR donde el "flujo de claves es generado por un generador de números pseudoaleatorio") y verificaciones de cordura simples contra las grietas. Algunos desarrolladores también implementan algoritmos para verificar que los binarios estén intactos (para reducir el riesgo de agrietamiento) o para asegurar que el usuario no esté ejecutando un depurador (para reducir el riesgo de que se desarrolle una falla), pero estos son más debatibles.
Si solo estás haciendo un juego independiente más pequeño, que solo pueden jugar unos pocos miles de jugadores, no te molestes en implementar ningún algoritmo anti-trampa hasta que 1) los necesites; o 2) la base de usuarios crece.
Podría intentar imponer latencia a todos sus clientes, dependiendo de la latencia promedio en el área. De esta forma, el cliente puede tratar de evitar los problemas de latencia y se sentirá similar para la mayoría de los jugadores.
Por supuesto, no estoy sugiriendo que obligue a un retraso de 500ms a todos, pero las personas con 50ms pueden estar bien con 150 (100 ms adicionales agregados) para que la jugabilidad parezca más fluida.
En una palabra; si tienes 3 jugadores:
- John: 30ms
- Paul: 150ms
- Amy: 80ms
Después de los cálculos, en lugar de enviar los datos nuevamente a los clientes, todo al mismo tiempo, cuenta su latencia y comienza a enviar a Paul y Amy antes que a John, por ejemplo.
Pero este enfoque no es viable en situaciones de latencia extrema donde las conexiones de acceso telefónico o los usuarios inalámbricos realmente podrían estropearlo para todos. Pero es una idea.
Vea cómo lo hace Valve en Source Engine: http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
Si se trata de un shooter en primera persona, probablemente tendrás que profundizar en algunos de los temas que mencionan, tales como: predicción, compensación e interpolación.
hemos implementado un juego de serpiente multijugador basado en un servidor obligatorio y jugadores remotos que hacen predicciones. Cada 150 ms (en la mayoría de los casos) el servidor devuelve un mensaje que contiene todos los movimientos consolidados enviados por cada jugador remoto. Si los movimientos de los clientes remotos llegan tarde al servidor, los descarta. El cliente reproducirá el último movimiento.