Tôi đang triển khai một máy chủ trò chơi hỗ trợ cận chiến giống như Star Control . Vì vậy, bạn có tàu bay và bắn súng, với vật lý tốc độ / gia tốc / giảm chấn siêu đơn giản để điều khiển chuyển động.
Tôi đã đọc Valve, Gafferon và Gambetta và triển khai thuật toán của Gambetta để dự đoán khách hàng:
Dự đoán máy khách hoạt động trên tàu người chơi bằng cách cập nhật vị trí của nó từ máy chủ khi nó đến và sau đó áp dụng lại đầu vào chưa được xử lý của máy chủ cho tàu người chơi.
Thật không may, nó không hoạt động tốt cho trò chơi của tôi. Tôi tin rằng nó phải liên quan đến thực tế là ví dụ của Gambetta không tính đến các đối tượng đã di chuyển hoặc các lệnh được cập nhật từng bước một. (theo "bước" ý tôi là khung). Vì vậy, trong trò chơi của tôi, người chơi nhấn lên để tăng tốc con tàu (đã di chuyển), tiếp tục di chuyển trên máy khách, gửi lệnh đến máy chủ và thường nhận được ảnh chụp nhanh từ máy chủ ở bước tiếp theo. Tôi nhận được một cái gì đó giống như:
Lệnh người chơi chạy ở máy khách bước 3 , nhưng trên máy chủ, nó chỉ chạy ở máy chủ bước 5 . Vào thời điểm ảnh chụp nhanh thế giới được nhận bởi khách hàng ở bước 6 của khách hàng , dự đoán sẽ tắt, đặc biệt là với vận tốc nhanh hơn.
Mấu chốt của vấn đề là máy khách chạy lệnh ở bước 5 , nhưng máy chủ chạy nó ở bước 6 . Tôi nghĩ về việc có thể gửi bước máy khách bằng lệnh và để máy chủ quay lại và chạy lại lệnh với bước thời gian của máy khách. Tuy nhiên, điều đó có thể dẫn đến một loạt các vấn đề khác - như những gì xảy ra với các lệnh nhận được kể từ khi khôi phục hoặc cách khách hàng gian lận có thể khai thác bằng cách thay đổi bước đã gửi.
Đọc và xem video như thế này từ Google đề cập đến một cách tiếp cận khác, trong đó bạn dần thay đổi vị trí người chơi để phù hợp với vị trí của ảnh chụp nhanh qua một vài bước.
Những câu hỏi của tôi:
Bạn có thể làm cho thuật toán của Gambetta hoạt động với chuyển động bước liên tục không? Hoặc là về mặt khái niệm không tương thích với trò chơi của tôi?
Là nội suy dần dần qua các bước là cách chính xác để đi sau đó? Nếu vậy, làm thế nào để bạn nội suy một đối tượng đã di chuyển từ vị trí máy khách để khớp với thứ vừa nhận được từ máy chủ?
Các phương thức này, nội suy dần dần và thuật toán của Gambetta có thể hoạt động song song hay chúng có loại trừ lẫn nhau không?