¿Cómo sincronizo el cliente y el servidor cuando envío cambios de velocidad del reproductor?


10

Estoy implementando la predicción del lado del cliente. La mayoría de las explicaciones asumen que el cliente envía mensajes como " Mueve mi reproductor 1 posición hacia arriba ". ¿Qué sucede si envío mensajes como " Establecer la velocidad de mi reproductor en x "?

gráfico explicativo;  mostrando mensajes enviados y posiciones calculadas en el cliente y el servidor a lo largo del tiempo

En el cliente, el jugador establece su propia velocidad (según la predicción del lado del cliente) antes que el servidor, lo que hace que ambos se desincronicen. Este problema persiste incluso teniendo en cuenta la latencia promedio.

¿Cómo puedo abordar esto?

Respuestas:


8

Debe enviar datos redundantes, lo que aquí significa enviar la posición y la velocidad. Incluso si no está sincronizado, el hecho de que tenga la posición y la velocidad le permite corregir la trayectoria utilizando una función de interpolación.

Luego, usar algunos trucos como animaciones retrasadas, aceleraciones, etc. permite ocultar la latencia.

Editar: supongo que el servidor tiene autoridad.


Gracias por tu respuesta. Sí, el servidor es automático, pero incluso si envío datos redundantes con mi velocidad, el cliente puede corregir sus errores, pero a menudo leo cosas como "Si el cliente / servidor usa código compartido para sus entidades, los errores de predicción nunca ocurrirán realmente", pero en mi caso, SIEMPRE ocurrirán un poco, lo que causaría tartamudeo por todas partes.
Blu3

1
@ user13842 el cliente siempre se desincronizará, debe corregir la posición y velocidad del lado del cliente, como dijo Thelvyn, de acuerdo con lo que el servidor le envíe. de esa manera no obtendrá el movimiento de tartamudeo a menos que su cliente esté completamente fuera de sincronización, entonces tendrá que ajustar los valores porque la corrección tomaría demasiado tiempo.
Dreta

Esta es la razón principal para usar una función de interpolación. No puede evitar la latencia, por lo que debe corregir el movimiento de manera uniforme. El cliente y el servidor simulan el mundo, pero el cliente tiene que escuchar al servidor y realizar correcciones. Algunas técnicas utilizadas en las redes de Source Engine: developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
Thelvyn

también se menciona brevemente en esta charla de Google, debería transmitir la idea a través de youtube.com/watch?v=Prkyd5n0P7k#t=18m47s
dreta

He encontrado otra solución para este problema en particular. Agrego el tiempo que el cliente aplicó su entrada con cada paquete. Lo que significa que # 1 tendría tiempo: 0 y la segunda vez: 100. Ahora el servidor sabe que el cliente presionó su botón a la vez: 100 y no antes.
Blu3
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.