Eu acho que definitivamente não é bom sincronizar o relógio no sistema . O usuário não espera que você toque nas configurações do sistema e muitos sistemas nem permitem.
Tudo o que você precisa é ter uma correlação para converter o registro de data e hora do relógio de um lado para o relógio do outro lado. Por outro lado, você precisa que essa correlação seja bastante precisa, digamos pelo menos até um centésimo de segundo, se você quiser usá-la para prever as posições dos jogadores. O relógio do sistema nunca estará tão bem correlacionado entre máquinas aleatórias. Portanto, você mesmo deve estabelecer a correlação, usando alguma variação no tema NTP , provavelmente incorporado em outras mensagens para economizar a largura de banda da rede.
A idéia básica pode ser que, em cada pacote enviado, você tenha enviado o carimbo de data / hora, o número de sequência e o carimbo de data e hora quando recebeu o último pacote do outro lado. A partir disso, você calcula a viagem de ida e volta: por exemplo, se o pacote Q diz que foi enviado em 1000 e o pacote P foi recebido em 500, então, se você enviou o pacote P em 0 e está recebendo Q em 800, a viagem de ida e volta é (800 - 0 ) - (1000 - 500) = 300. Não há como saber a assimetria, portanto, você assume que o pacote leva metade (150) tiques em qualquer direção. E esse timestamp remoto está à frente do local em 1000 - (800 - 150) = 350 ticks. A viagem de ida e volta varia. Se você presumir que o relógio é razoavelmente preciso, use uma média de longo prazo da correlação.
Observe que você também não deseja usar o relógio do sistema. Eles podem ser ressincronizados no meio do caminho, tirando você dos trilhos. Você deve usar clock(CLOCK_MONOTONIC)
no Unix ou GetTickCount
no Windows (não tenho certeza de como essas APIs estão agrupadas em Java ou Python agora).
Nota: A SO_TIMESTAMP
opção socket (consulte o socket (7) mencionado por ott-- no comentário sobre a pergunta) seria útil para separar o efeito da latência do loop de eventos que recebe os pacotes. Se vale a pena o esforço depende de quão boa precisão você precisa.