Tôi đã không thực sự thực hiện điều này (vì vậy có thể có một số vấn đề tôi không thấy ngay lập tức), nhưng tôi nghĩ tôi sẽ cố gắng giúp đỡ.
Đây là những gì bạn nói đang xảy ra:
Khách hàng A gửi đầu vào tại T0
Máy chủ nhận đầu vào tại T1
Tất cả khách hàng nhận được sự thay đổi tại T2
Tuy nhiên, tại T2, sử dụng dự đoán của khách hàng, Khách hàng A hiện đang ở vị trí phù hợp với T4.
Có lẽ sẽ hữu ích khi nghĩ về thời gian máy chủ. Nó (có lẽ) rất giống với cách hoạt động của phép nội suy .
Mỗi lệnh được gửi lên với một thời gian máy chủ. Thời gian máy chủ này được tìm ra khi bắt đầu trận đấu bằng cách truy vấn đánh dấu vào máy chủ, bù cho thời gian ping. Trên máy khách, bạn có số lượng đánh dấu cục bộ của riêng mình và mỗi lệnh bạn gửi lên được chuyển đổi thành dấu tick của máy chủ (đó là một thao tác trừ đơn giản)
Ngoài ra, khách hàng luôn luôn hiển thị "trong quá khứ". Vì vậy, bạn cho rằng thế giới mà khách hàng nhìn thấy là, đằng sau 100ms so với thời gian thực sự của máy chủ.
Vì vậy, hãy viết lại ví dụ của bạn với thời gian máy chủ (được chỉ định bởi S).
Máy khách gửi đầu vào tại T0 với thời gian máy chủ S0 (mà tôi đoán thực sự là "đại diện máy khách của thời gian máy chủ trừ đi thời gian nội suy"). Khách hàng không chờ phản hồi từ máy chủ và di chuyển ngay lập tức.
Máy chủ nhận đầu vào tại T1. Máy chủ chỉ ra vị trí có thẩm quyền của khách hàng tại thời điểm máy chủ S0 do khách hàng cung cấp. Gửi nó cho khách hàng.
Khách hàng nhận được vị trí có thẩm quyền tại T2 (vẫn có chỉ định thời gian máy chủ S0). Khách hàng theo dõi một số giá trị thời gian trong quá khứ của các sự kiện trước đó (có thể chỉ là một hàng đợi của tất cả các dự đoán chưa được xác nhận).
Nếu vị trí / vận tốc dự đoán / bất cứ thứ gì mà máy chủ gửi lại tại S0 khác với những gì khách hàng đã lưu trữ tại S0, thì máy khách sẽ xử lý việc này bằng cách nào đó. Hoặc bằng cách đưa người chơi trở lại vị trí trong quá khứ của họ hoặc mô phỏng lại đầu vào trước đó, hoặc có thể là điều gì đó khác mà tôi chưa từng nghĩ tới.