Thừa nhận bạn có độ trễ 30 m giữa khách hàng và máy chủ. Khách hàng gửi "Tôi muốn di chuyển vợt của tôi xuống" và vợt của nó là tại y = 100px với một vận tốc của 0.1px/ms
30ms giây sau:
- client vợt là tại y = 100 + 30 * 0,1 = 103px
- máy chủ nhận được đơn đặt hàng từ khách hàng và bắt đầu di chuyển vợt (mà hiện nay vẫn còn tại y = 100px ở phía máy chủ)
20ms giây sau:
- client vợt là tại y = 103 + 20 * 0,1 = 105px
- server-side client vợt là tại y = 100 + 20 * 0,1 = 102px
- máy chủ gửi cho khách hàng vị trí mới (102px)
30ms giây sau:
- client rarcket là y = 105 + 30 * 0,1 = 108px
- khách hàng nhận được từ máy chủ các vị trí phía mới của vợt : 102px
Tại thời điểm này, vợt khách hàng "nhảy" ngược từ 108 đến 102px ...
Làm thế nào để đối phó với những độ trễ mạng? Hai bổ sung cách:
- chờ đợi máy chủ acknowlegment trước khi thực hiện một hành động
- dự đoán kết quả của các hành động (trên máy khách và máy chủ bên)
Các aproach đầu tiên được sử dụng khi hiệu lực thi hành khách hàng hầu như không liên kết với kết quả và không thể là "rollback". Ví dụ: khi một khách hàng bắn một tên lửa, nó không thể nhận ra rằng tên lửa này đang bị máy chủ ức chế trong lần cập nhật tiếp theo bởi vì khách hàng thực tế không còn có tên lửa nữa. Vì vậy, trong trường hợp này, ứng dụng của khách hàng sẽ khởi chạy tên lửa chỉ hỗ trợ máy chủ gửi một xác nhận.
Cách thứ hai luôn được sử dụng để tránh những "lần nhảy" này khi đồng bộ hóa máy chủ. Bạn phải theo dõi độ trễ của mạng để dự đoán việc di chuyển các yếu tố trò chơi của mình. Dưới đây là hai cách: tính toán ping hoặc đồng bộ hóa máy chủ và thời gian máy khách khi khởi động (cách dễ nhất và mạnh mẽ hơn). Ý tưởng chung là:
- client gửi "Tôi muốn di chuyển vợt của tôi xuống lúc = 1.265.871" và bắt đầu di chuyển
30ms sau: vợt
- khách hàng tại y = 100 + 30 * 0.1 = 103px
- máy chủ nhận được di chuyển và tính toán độ trễ 30ms (bằng cách ping hoặc thời gian đồng bộ khác biệt) và đặt vị trí vợt tại y = 100 + độ trễ * 0.1 = 100 + 30 * 0.1 = 103px
Hoàn hảo! Chúng được đồng bộ hóa.
20ms sau:
- server và client vợt ở cả y = 103 + 20 * 0,1 = 105px
- máy chủ gửi vị trí mới và hướng
30ms sau:
- vợt của khách hàng tại y = 105 + 30 * 0.1 = 108px
- khách hàng r eceives vị trí mới VÀ hướng (105px di chuyển xuống), tính toán độ trễ 30ms và đặt vị trí vợt tại y = 105 + độ trễ * 0.1 = 105 * 30 * 0.1 = 108px
Một lần nữa, máy khách và máy chủ được đồng bộ!
Đồng bộ hóa có thể xảy ra trên ứng dụng khách khác khi khách hàng đầu tiên ngừng di chuyển. Trong trường hợp này, vợt máy nghe nhạc sẽ "nhảy" một chút. Khi điều này không quan trọng, có thể làm mịn quá trình chuyển đổi này.
Hy vọng điều đó sẽ hữu ích.
Bạn có ý nghĩa gì với "kết quả không hài lòng" và "di chuyển đối tượng qua lại"? – BlueCookie
Bài viết này xuất hiện sau câu hỏi này: http://drewblaisdell.com/writing/game-networking-techniques-explained-with-pong/ – opyate