시스템 의 시계 를 동기화 하는 것은 확실히 좋지 않다고 생각합니다 . 사용자는 시스템 설정을 만질 것을 기대하지 않으며 많은 시스템에서 허용하지 않습니다.
타임 스탬프를 한 쪽 시계에서 다른 쪽 시계로 변환하기 위해 상관 관계를 갖기 만하면됩니다. 반면, 플레이어 위치를 예측하기 위해이 상관 관계를 사용하려면이 상관 관계가 다소 정확해야합니다 (예 : 적어도 100 분의 1 초). 시스템 클럭 은 임의의 머신간에 이처럼 상관 관계 가 없습니다 . 따라서 NTP 테마의 일부 변형을 사용하여 네트워크 대역폭을 보존하기 위해 다른 메시지에 포함 된 상관 관계를 직접 설정해야 합니다.
기본 아이디어는 타임 스탬프를 보낸 각 패킷과 다른 쪽에서 마지막 패킷을 받았을 때 시퀀스 번호 및 타임 스탬프를 보낸 것입니다. 예를 들어, 패킷 Q가 1000으로 전송되었고 패킷 P가 500으로 수신되었다고 표시하면 패킷 P가 0으로 전송되고 800에서 Q를 수신하는 것보다 왕복이 (800-0) 인 경우 )-(1000-500) = 300. 아 시메트리를 알 수있는 방법이 없으므로 패킷이 어느 방향 으로든 반 (틱) 틱을 취한다고 가정하면됩니다. 그리고이 원격 타임 스탬프는 로컬보다 1000-(800-150) = 350 틱입니다. 왕복은 다를 수 있습니다. 클록이 합리적으로 정확하다고 가정하면 장기적인 평균 상관 관계를 사용해야합니다.
시계에도 시스템 시계를 사용하고 싶지는 않습니다. 중간에 재 동기화되어 트랙에서 벗어날 수 있습니다. 당신은 사용해야 clock(CLOCK_MONOTONIC)
유닉스 또는 GetTickCount
(하지 않도록하는 API를 현재 Java 또는 Python으로 포장하는 방법) Windows에서.
참고 : SO_TIMESTAMP
소켓 옵션 ( 질문에 대한 의견에서 ott가 언급 한 socket (7) 참조 )은 패킷을 수신하는 이벤트 루프의 대기 시간 효과를 분리하는 데 유용합니다. 노력할 가치가 있는지 여부는 필요한 정밀도가 얼마나 좋은지에 달려 있습니다.