Tôi nghĩ rằng nó chắc chắn là không OK để synchornize đồng hồ trong hệ thống . Người dùng không mong đợi bạn chạm vào cài đặt hệ thống và nhiều hệ thống thậm chí sẽ không cho phép bạn.
Tất cả những gì bạn cần là có một mối tương quan để chuyển đổi dấu thời gian từ đồng hồ này sang đồng hồ khác. Mặt khác, bạn cần mối tương quan này khá chính xác, hãy nói ít nhất là một phần trăm giây, nếu bạn muốn sử dụng nó để dự đoán vị trí người chơi. Đồng hồ hệ thống sẽ không bao giờ tương quan tốt giữa các máy ngẫu nhiên này. Vì vậy, bạn nên tự thiết lập mối tương quan, sử dụng một số biến thể trên chủ đề NTP , có thể được nhúng trong các thông báo khác của bạn để tiết kiệm băng thông mạng.
Ý tưởng cơ bản có thể là với mỗi gói bạn gửi dấu thời gian bạn đã gửi nó và số thứ tự và dấu thời gian khi bạn nhận được gói cuối cùng từ phía bên kia. Từ đây, bạn tính toán khứ hồi: Ví dụ: nếu gói Q nói rằng nó được gửi ở 1000 và gói P được nhận ở mức 500, so với khi bạn gửi gói P ở 0 và đang nhận Q ở 800, thì khứ hồi là (800 - 0 ) - (1000 - 500) = 300. Không có cách nào để biết được sự đồng điệu, vì vậy bạn chỉ cần giả sử gói mất một nửa (150) tick theo một trong hai hướng. Và dấu thời gian từ xa đó đi trước địa phương 1000 - (800 - 150) = 350 tick. Chuyến đi khứ hồi sẽ khác nhau. Nếu bạn cho rằng đồng hồ là chính xác hợp lý, bạn nên sử dụng mức trung bình dài hạn của mối tương quan.
Lưu ý rằng bạn cũng không muốn sử dụng đồng hồ hệ thống cho đồng hồ. Họ có thể được đồng bộ hóa giữa chừng, ném bạn đi sai hướng. Bạn nên sử dụng clock(CLOCK_MONOTONIC)
trên Unix hoặc GetTickCount
trên Windows (không chắc chắn cách các API đó được gói trong Java hoặc Python ngay bây giờ).
Lưu ý: SO_TIMESTAMP
Tùy chọn ổ cắm (xem ổ cắm (7) được đề cập bởi ott-- trong nhận xét về câu hỏi) sẽ hữu ích để phân tách ảnh hưởng của độ trễ của vòng lặp sự kiện nhận các gói. Liệu nó có xứng đáng với nỗ lực hay không phụ thuộc vào mức độ chính xác mà bạn cần.