¿Interpolando entre dos estados en red?

11

Tengo muchas entidades en el lado del cliente que se simulan (sus velocidades se agregan a sus posiciones en función de cada cuadro) y les dejo que se calculen. Envían actualizaciones sobre dónde fueron vistos por última vez y sus cambios de velocidad. Esto funciona muy bien y otros jugadores ven este trabajo encontrar. Sin embargo, después de un tiempo, estos jugadores comienzan a desincronizarse después de un tiempo. Esto se debe a la latencia.

Me gustaría saber cómo puedo interpolar entre estados para que parezcan estar en la posición correcta. Sé dónde se vio por última vez al jugador y su velocidad actual, pero interpolar al último estado visto hace que el jugador realmente se mueva hacia atrás. No pude usar la velocidad para otros clientes y simplemente 'inclinarlos' hacia la dirección apropiada, pero siento que esto causaría un movimiento irregular. Cuales son las alternativas?

Vaughan Hilts
fuente

Respuestas:

9

Por esta razón, encontrará que las simulaciones a menudo se ejecutan 1 o más fotogramas antes de lo que de hecho se representa en un momento dado en un cliente determinado. En otras palabras, lo que renderiza podría ser el segundo último cuadro, no el último cuadro.

Busque en este artículo todas las instancias de la palabra "adelante" y creo que comenzará a obtener una imagen mejor de lo que podría haber explicado anteriormente.

Ingeniero
fuente
De acuerdo, ¿estás insinuando que realmente debería renderizar el reproductor como estaba hace 300 ms e interpolar hacia el futuro? (En un estado separado, cuando llega un nuevo estado; esto cambiaría)
Vaughan Hilts
@VaughanHilts Nuevamente, por favor lea el artículo y los comentarios. Gaffer es un experto en ese campo y lo explica mucho más claramente que yo. Pero la idea general es que sí, su modelo de simulación está adelante mientras que su renderizado está algo por detrás para dar cuenta del efecto que describió. De ninguna manera es el único lugar donde he visto esta técnica descrita.
Ingeniero
2

Cuando tu dices:

estos jugadores comienzan a desincronizarse después de un tiempo

me hace pensar que su problema puede tener más que ver con que sus relojes se salgan del paso que con cualquier problema de latencia. Si es latencia, debería ser igual de malo al comienzo de 10 minutos. Si un reloj de juego funciona un poco más rápido que el otro, habrá algunos artefactos de nerviosismo extraños que empeorarán con el tiempo. Un cliente podría estar simulando en el futuro, cuando los paquetes actuales lleguen del servidor, tirará al cliente hacia atrás, haciendo que las entidades salten. Ejecute algunas pruebas más para averiguarlo.

Si los relojes de juego no sincronizados son realmente un problema, deberás mirar con mucho cuidado tu ciclo de actualización y asegurarte de que cada actualización se base en la cantidad de tiempo de juego transcurrido (ya sea fijo o variable), y que el juego -el tiempo se avanza usando algo como el reloj de pared (no el tiempo de renderizado u otras variables). Gaffer tiene algunos buenos artículos sobre esto, y aquí hay una pregunta decente sobre los tiempos fijos y los variables . Espero que esto ayude.

John McDonald
fuente
Este no es el caso, el caso es el hecho de que calculo demasiado lejos (un pico de retraso o algo así: el paquete para "parar" no se recibe a tiempo y el cliente no puede corregirse a tiempo. Sé que esto definitivamente el caso, porque después de que el cliente ha dejado más que pueda volver DEFINTELAY interpolar en su posición.
Vaughan Hilts