Estoy trabajando en un tirador 2D de arriba hacia abajo y estoy haciendo todo lo posible para copiar conceptos utilizados en juegos en red como Quake 3.
- Tengo un servidor autorizado.
- El servidor envía instantáneas a los clientes.
- Las instantáneas contienen una marca de tiempo y posiciones de entidad.
- Las entidades se interpolan entre las posiciones de las instantáneas para que el movimiento se vea suave.
- Por necesidad, la interpolación de entidades ocurre levemente "en el pasado" para que tengamos múltiples instantáneas en las que interpolar.
El problema al que me enfrento es la "sincronización del reloj".
- En aras de la simplicidad, imaginemos por un momento que no hay latencia al transferir paquetes desde y hacia el servidor.
- Si el reloj del servidor está 60 segundos por delante del reloj del cliente, entonces una marca de tiempo de la instantánea estará 60000ms por delante de la marca de tiempo local del cliente.
- Por lo tanto, las instantáneas de la entidad se recopilarán y se sentarán durante unos 60 segundos antes de que el cliente vea que una entidad determinada realiza sus movimientos, ya que el reloj del cliente tarda tanto en ponerse al día.
Logré superar esto calculando la diferencia entre el servidor y el reloj del cliente cada vez que se recibe una instantánea.
// For simplicity, don't worry about latency for now...
client_server_clock_delta = snapshot.server_timestamp - client_timestamp;
Al determinar qué tan avanzada está la entidad en la interpolación, simplemente agrego la diferencia a la hora actual del cliente. Sin embargo, el problema con esto es que causará sacudidas porque la diferencia entre los dos relojes fluctuará abruptamente debido a que las instantáneas llegan más rápido / más lento que otros.
¿Cómo puedo sincronizar los relojes lo suficientemente cerca como para que el único retraso perceptible sea el codificado para la interpolación y el causado por la latencia de red ordinaria?
En otras palabras, ¿cómo puedo evitar que la interpolación comience demasiado tarde o demasiado pronto cuando los relojes se desincronizan significativamente, sin introducir sacudidas?
Editar: según Wikipedia , NTP se puede utilizar para sincronizar relojes a través de Internet en cuestión de unos pocos milisegundos. Sin embargo, el protocolo parece complicado, ¿y quizás excesivo para usar en juegos?