Estou trabalhando em um shooter 2D de cima para baixo e fazendo o possível para copiar conceitos usados em jogos em rede como o Quake 3.
- Eu tenho um servidor autorizado.
- O servidor envia instantâneos para os clientes.
- Os instantâneos contêm um registro de data e hora e posições da entidade.
- As entidades são interpoladas entre as posições do instantâneo, para que o movimento pareça suave.
- Por necessidade, a interpolação de entidade ocorre um pouco "no passado", de modo que temos vários instantâneos nos quais podemos interpolar.
O problema que estou enfrentando é "sincronização do relógio".
- Por uma questão de simplicidade, vamos fingir por um momento que não há latência ao transferir pacotes de e para o servidor.
- Se o relógio do servidor estiver 60 segundos antes do relógio do cliente, o registro de data e hora da captura instantânea será 60000ms antes do registro de data e hora local do cliente.
- Portanto, os instantâneos da entidade serão coletados e permanecerão em repouso por cerca de 60 segundos antes que o cliente veja qualquer entidade fazer seus movimentos, porque leva muito tempo para o relógio do cliente recuperar o atraso.
Consegui superar isso calculando a diferença entre o servidor e o relógio do cliente cada vez que um instantâneo é recebido.
// For simplicity, don't worry about latency for now...
client_server_clock_delta = snapshot.server_timestamp - client_timestamp;
Ao determinar até que ponto a interpolação está na entidade, simplesmente adiciono a diferença ao horário atual do cliente. O problema com isso, no entanto, é que ele causará instabilidade, pois a diferença entre os dois relógios flutuará abruptamente devido aos instantâneos que chegam mais rápido / mais lentamente que os outros.
Como sincronizar os relógios com a precisão necessária para que o único atraso perceptível seja o codificado para interpolação e o causado pela latência comum da rede?
Em outras palavras, como posso impedir que a interpolação seja iniciada muito tarde ou muito cedo quando os relógios são dessincronizados significativamente, sem introduzir instabilidade?
Edit: De acordo com a Wikipedia , o NTP pode ser usado para sincronizar relógios pela Internet em questão de alguns milissegundos. No entanto, o protocolo parece complicado e talvez exagerado para uso em jogos?