Estamos creando un juego multijugador en tiempo real, en el que cada jugador es responsable de informar su estado en cada iteración del bucle del juego.
Las actualizaciones de estado se transmiten utilizando UDP poco confiable .
Para minimizar el envío de datos de estado, hemos creado un sistema que enviará solo deltas (cualquier información de estado que se haya cambiado).
Sin embargo, este método es defectuoso, ya que un paquete perdido significará que otros jugadores no recibirán el delta, haciendo que el juego se comporte de una manera inesperada.
Por ejemplo:
Suponga que ese estado se compone de: {positionX, positionY, health}
Frame 1 - positionX changed --> send a packet with positionX only.
Frame 2 - health changed // lost !
Frame 3 - positionY changed --> send a packet with positionY only.
// Otros jugadores no saben sobre el cambio de salud.
¿Cómo se puede superar este problema entonces? enviar todos los datos no siempre es factible.
fuente
También puede solucionar el problema enviando una actualización de estado completa del servidor a los clientes, digamos cada segundo. Si un cliente no recibió un paquete, se comportará incorrectamente hasta que reciba la actualización de estado completa. Entonces estará sincronizado nuevamente.
fuente
Muchos juegos usan UDP y TCP / IP para enviar / recibir datos y, según la frecuencia con la que se envían los datos, se utilizan diferentes protocolos.
Por ejemplo:
UDP: actualizaciones posicionales, y cualquier otra cosa que potencialmente podría enviarse / recibirse varias veces por segundo.
TCP / IP: acciones de inventario, acciones de hechizo / habilidad (la mayoría de las acciones realizadas por el usuario)
Realmente depende de la cantidad de tráfico de cada artículo. Si encuentra que está enviando actualizaciones de HP con bastante frecuencia, entonces tal vez tengan que estar en UDP.
fuente
Si lee la revisión del código fuente de Quake 3 , explica el modelo de red que es muy similar a su diseño, pero con una solución para los paquetes descartados.
Esencialmente, en su modelo está enviando deltas contra el estado directamente anterior. En el modelo quake3, envía deltas contra el último estado acknolwedged del par.
fuente