La muestra que vinculó establece directamente la posición a lo que recibe de la red, ¡esta es una mala idea para un juego multijugador!
Lo que debe hacer en un juego real es interpolar entre la posición local y la posición remota. Por lo tanto, el método de recibir vería un poco como esto:
void Receive(packet)
{
unit.RemoteX = packet.Read_X_Position();
unit.RemoteY = packet.Read_Y_Position();
}
Esto no tiene ningún efecto sobre la posición local de la unidad, en lugar de su método de actualización (cada cuadro), se mueve la posición local hacia la posición remota :
void Interpolate(deltaTime)
{
difference = unit.RemoteX- unit.LocalX
if (difference < threshold)
unit.LocalX = unit.RemoteX
else
unit.LocalX += difference * deltaTime * interpolation_constant
}
a continuación, mostrar la posición de "local" de la unidad, con ello se consigue el movimiento lagless así:
- Si la posición de la unidad está casi en la posición remota, saltará a la remota pag osition (sin embargo, saltará una distancia tan pequeña que no se verá laggy).
- Si la diferencia es demasiado grande para saltar, entonces avance lentamente hacia la posición en la que debería estar. La constante de interpolación controla qué tan rápido convergerán las posiciones local y remota. En la interpolación constante cero, la unidad ignorará actualizaciones de la red, la constante 1 se teletransportarse directamente a la posición de la red (y buscar lag) - por lo que necesita para elegir un compromiso en algún punto intermedio
Dado que la unidad se mueve sin problemas hacia donde debería estar, ¡parece que no hay desfase en absoluto!
Hay otras cosas que debe tener en cuenta al implementar este tipo de sistema, por ejemplo, a menudo desea un límite superior de cuán lejos pueden estar las unidades de su posición remota; de lo contrario, el estado local y remoto puede "despegarse" en algunas situaciones Si están demasiado separados (lo que nunca debería suceder, excepto en casos de retraso extremo), puede detener el juego y decirle al usuario que está demasiado relajado, o saltar la unidad directamente a su posición, que se verá lenta, pero al menos el juego continuar.
Adición: Al volver a leer esta respuesta, se me ocurre que una mejora sería realizar un seguimiento de las diferencias horarias. Si sabe (más o menos) cuál es el desfase en el sistema, entonces sabrá que cuando recibe un paquete con una posición remota sabe aproximadamente qué tan lejos en el pasado está el paquete. Si envía velocidad remota también, puede predecir dónde está el objeto ahora (suponiendo velocidad constante). Esto puede hacer que la diferencia entre el estado local estimado y el verdadero estado remoto sea más pequeña en algunos juegos, en otros juegos (donde hay muchas velocidades cambiantes) puede empeorar las cosas.
Esta pregunta parece no estar relacionada con el tema y debería trasladarse a Gamedev.SE – Kromster
¿GamedevSE estaba activo en 2010, cuando se publicó? –