Tôi đang làm một trò chơi vật lý có nhịp độ nhanh đó là khúc côn cầu trên bàn. Với hai vồ và một puck. Trò chơi chạy trên iphone / ipad và tôi đang thực hiện phần nhiều người chơi thông qua GameCenter.
Đây là cách hệ thống mạng hoạt động. Máy khách sẽ đánh dấu sao trận đấu, sẽ được giải quyết dưới dạng máy chủ và người chấp nhận yêu cầu đối sánh là máy khách.
'Máy chủ' có vật lý đang chạy và phản hồi ngay lập tức và máy khách cũng có vật lý của chúng chạy để nó trông mượt mà giữa các trao đổi tin nhắn. Những gì tôi làm với tư cách là máy chủ, là tôi gửi cho khách hàng vận tốc puck của tôi và vị trí của tôi và khách hàng điều chỉnh vận tốc / vị trí puck của anh ta liên quan đến máy chủ để giữ cho nó được đồng bộ hóa. Mặt khác, vật lý không đồng bộ hóa và nó vặn nó lên.
Khi độ trễ mạng tốt, dưới 100ms kết quả khá tốt, tôi có một trò chơi mượt mà ở phía khách hàng và hành vi kỳ lạ là tối thiểu. Vấn đề xảy ra khi độ trễ khoảng 150 đến 200ms. Trong trường hợp đó, xảy ra việc khách hàng của tôi đã ném một cạnh và đảo ngược hướng nhưng nó nhận được một thông báo chậm trễ từ máy chủ và nó quay lại một chút gây ra cảm giác kỳ lạ cho hành vi bóng.
Tôi đã đọc một vài điều về nó:
Wikipedia trên Đồng bộ hóa đồng hồ
Vì vậy, làm thế nào tôi có thể giải quyết điều này? Theo như tôi đã đọc tùy chọn tốt nhất mà tôi có là thực hiện đồng bộ hóa đồng hồ trên máy chủ / máy khách với dấu thời gian để khi tôi nhận được thông báo trễ liên quan đến đồng hồ của mình, tôi chỉ cần bỏ qua và để cho máy khách mô phỏng việc làm. Các bạn có đồng ý với điều đó không? Và vì tôi đang gửi dữ liệu không đáng tin cậy (UDP) nên tôi có thể nhận được tin nhắn hoặc tin nhắn bị trì hoãn.
Nếu đó là cách tiếp cận tốt nhất, làm thế nào để tôi thực hiện đồng bộ hóa đồng hồ. Tôi đã đọc các bước về cách làm nhưng tôi không hiểu lắm.
Nó nói rằng:
- Khách hàng đóng dấu giờ địa phương hiện tại trên gói "yêu cầu thời gian" và gửi đến máy chủ.
- Khi nhận được bởi máy chủ, máy chủ đóng dấu thời gian máy chủ và trả lại
- Khi khách hàng nhận được, khách hàng sẽ trừ thời gian hiện tại khỏi thời gian gửi và chia cho hai để tính độ trễ. Nó trừ thời gian hiện tại từ thời gian máy chủ để xác định delta thời gian của máy khách-máy chủ và thêm vào độ trễ một nửa để có được đồng hồ chính xác. (Cho đến nay algothim này rất giống với SNTP)
- Khách hàng lặp lại các bước từ 1 đến 3 năm lần trở lên, tạm dừng vài giây mỗi lần. Lưu lượng khác có thể được cho phép trong thời gian tạm thời, nhưng nên được giảm thiểu để có kết quả tốt nhất Kết quả của các biên nhận gói được tích lũy và sắp xếp theo thứ tự độ trễ thấp nhất đến độ trễ cao nhất. Độ trễ trung bình được xác định bằng cách chọn mẫu điểm giữa từ danh sách được sắp xếp này.
- Tất cả các mẫu trên khoảng 1 độ lệch chuẩn so với trung vị đều bị loại bỏ và các mẫu còn lại được lấy trung bình bằng trung bình số học.
Theo ví dụ này tôi sẽ có cái này:
Hãy giả vờ trò chơi đã tải và thời gian khách hàng của tôi là 0, vì vậy tôi gửi cho máy chủ rằng thời gian của tôi là 0.
Các tin nhắn mất 150ms để đến máy chủ nhưng đồng hồ của máy chủ đã bắt đầu và đi trước khách hàng 1 giây. Khi máy chủ nhận được thông báo, thời gian sẽ là: 1.15 và gửi thời gian đó cho khách hàng, chúng ta có tốt không? Hãy giả vờ độ trễ của chúng tôi là không đổi ở 150ms.
Bây giờ khách hàng nhận được thời gian 1,15 và trừ thời gian hiện tại từ thời gian gửi và chia cho hai để tính độ trễ. Giá trị là: 0,3 - 0 = 0,3 / 2 -> 150ms.
Nó trừ thời gian hiện tại khỏi thời gian máy chủ để xác định đồng bằng thời gian của máy khách-máy chủ và thêm thời gian trễ một nửa để có được đồng hồ chính xác:
Thời gian máy khách: 0,3 Thời gian máy chủ 1.15
0,3 - 1,15 = 0,85 + độ trễ (.15) = 1
Làm thế nào là đồng bộ? Tôi đang thiếu gì
Đây là lần đầu tiên tôi trải nghiệm nhiều người chơi và trải nghiệm mạng, vì vậy tôi hơi bối rối.
Cảm ơn bạn.