Tôi đang thêm nhiều người chơi được nối mạng vào trò chơi tôi đã thực hiện. Khi máy chủ gửi gói cập nhật cho máy khách, tôi bao gồm dấu thời gian để máy khách biết chính xác khi nào thông tin đó hợp lệ. Tuy nhiên, máy tính của máy chủ và máy khách có thể có đồng hồ được đặt ở các thời điểm khác nhau (có thể chỉ là một vài giây khác biệt), do đó dấu thời gian từ máy chủ cần được dịch sang giờ địa phương của khách hàng.Đo chênh lệch thời gian giữa các thiết bị được nối mạng
Vì vậy, tôi muốn biết cách tốt nhất để tính chênh lệch thời gian giữa máy chủ và máy khách. Hiện tại, khách hàng ping máy chủ cho một dấu thời gian trong quá trình khởi tạo, cần lưu ý khi nào yêu cầu được gửi đi và khi nó được trả lời, và đoán rằng dấu thời gian được tạo gần nửa chặng đường. Khách hàng cũng điều hành 10 thử nghiệm này và lấy mức trung bình.
Nhưng, vấn đề là tôi nhận được kết quả khác nhau trong các lần chạy lặp lại của chương trình. Trong mỗi bộ 10, mỗi phép đo hiếm khi phân kỳ hơn 400 mili giây, có thể chấp nhận được. Nhưng nếu tôi đợi một vài phút giữa mỗi lần chạy chương trình, kết quả trung bình có thể không đồng ý bằng 2 giây, điều này là không thể chấp nhận được.
Có cách nào tốt hơn để tìm ra sự khác biệt giữa đồng hồ của hai thiết bị được nối mạng không? Hoặc là có ít nhất một cách để tinh chỉnh thuật toán của tôi để mang lại kết quả chính xác hơn?
Chi tiết có thể có hoặc không liên quan: Các thiết bị là iPod Touch giao tiếp qua Bluetooth. Tôi đang đo ping để ở bất cứ đâu từ 50-200 mili giây. Tôi không thể yêu cầu người dùng đồng bộ hóa đồng hồ của họ. :)
Cập nhật: Với sự giúp đỡ của các câu trả lời dưới đây, tôi đã viết một lớp khách quan để xử lý việc này. Tôi đã đăng nó lên blog của mình: http://scooops.blogspot.com/2010/09/timesync-was-time-sink.html
Wow! Cảm ơn! Đó chính xác là những gì tôi đang tìm kiếm. Nó không hoàn toàn rõ ràng với tôi nhưng tại sao nó tốt hơn so với phương pháp ban đầu của tôi (mặc dù tôi tin rằng nó là), nhưng tôi sẽ đăng lại ở đây khi tôi thử nó. Tôi không nghĩ rằng tôi sẽ cần phải điều chỉnh d trong suốt một phiên chơi game, nhưng nó không phải là khó để làm gì nếu tôi cần. Cảm ơn một lần nữa! – whooops
Điều này đã hoạt động rất tốt. Tôi thấy rằng nếu tôi luôn nhận các giá trị nhỏ nhất (tức là, tiêu cực nhất) t1 và t2, nó giống như việc lấy các ping nhỏ nhất, do đó nó hội tụ trên độ lệch chính xác. Tôi đã t1 = tem client - server tem và t2 = tem máy chủ - tem client Ngoài ra, tôi đã phát hiện ra rằng iphones trôi dạt khá đáng kể! Trong vòng nửa giờ, độ lệch thực tế giữa hai thiết bị có thể thay đổi nhiều đến nửa giây. Tôi đã xác minh điều này với các chương trình đồng hồ liên lạc với các máy chủ NTP. – whooops
Rất vui được giúp ích cho bạn. –