Làm thế nào để bù cho các đối tượng di chuyển với dự đoán phía khách hàng?


11

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.

nhập mô tả hình ảnh ở đây

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:

nhập mô tả hình ảnh ở đây

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ư:

nhập mô tả hình ảnh ở đây

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?


Tôi đã làm như vậy và gặp vấn đề chính xác. Ngay sau khi tôi thêm vận tốc áp dụng trạng thái máy chủ và áp dụng lại các đầu vào đã loại bỏ các thay đổi vận tốc đã được xử lý. Tôi đã cố gắng áp dụng lại tất cả các bản cập nhật kể từ lần nhận được tin nhắn cuối cùng nhưng nó vẫn chưa được suôn sẻ. Bạn đã bao giờ tìm thấy một giải pháp cho điều này?
MakuraYami

@MakuraYami Có - Tôi đã bắt đầu viết một bài viết mô tả giải pháp. Sẽ cập nhật sớm!
OpherV

Tôi đã làm việc nhiều hơn cho dự án của mình và tìm thấy một giải pháp có thể sử dụng và một số tài nguyên tốt hơn nói về vấn đề này. Tôi muốn thảo luận thêm, so sánh các giải pháp, v.v. Hãy cho tôi biết nơi tôi có thể liên hệ với bạn :)
MakuraYami

@makurayami tên người dùng của tôi tại Gmail
OpherV

Câu trả lời:


5

Trong 6 tháng kể từ khi tôi hỏi câu hỏi này, cuối cùng tôi đã phát triển một máy chủ trò chơi mã nguồn mở hoàn chỉnh để giải quyết vấn đề chính xác này (và nhiều vấn đề khác!): Http://lance.gg

nhập mô tả hình ảnh ở đây

R & D liên quan hiện nay cho phép tôi trả lời các câu hỏi của riêng mình:

  • 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?

    Thuật toán của Gambetta sẽ không hoạt động khi chuyển động của thực thể không mang tính quyết định (từ POV của khách hàng). Nếu một thực thể có thể bị ảnh hưởng mà không có đầu vào của vật lý hoặc người chơi khác, ví dụ như một cách tiếp cận phức tạp hơn cần phải được thực hiện.

  • 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ủ?

    Điều này chạm vào một chủ đề khác, đó là đối chiếu máy khách cập nhật máy chủ. Dần dầnNội suy hoạt động, nhưng đối với các trò chơi có nhịp độ rất nhanh như trong câu hỏi, tốt hơn là thực hiện ngoại suy

  • 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?

    Chúng có thể hoạt động cùng nhau, nhưng chỉ khi chuyển động thực thể có tính xác định từ POV của máy khách. Vì vậy, nó sẽ không hoạt động nếu thực thể bị ảnh hưởng bởi vật lý hoặc vật lý psuedo như chèn, kéo, v.v. '


1

Trò chơi của bạn dường như quá "thời gian thực" để suy nghĩ theo các bước thời gian. Tôi chỉ nghĩ về "lượt" nếu trò chơi có thể được coi là "theo lượt". Nếu không, chỉ cần từ bỏ ý tưởng về lượt hoặc bước. Mọi thứ trở nên dễ dàng hơn :)

Lưu ý rằng bạn dự đoán cục bộ cho trình phát của mình và chỉ nội suy cho các thực thể khác (như được giải thích trong bài viết thứ 3 trong loạt bài). Cách để đối phó với các bản cập nhật máy chủ cho các đối tượng đã di chuyển là đối chiếu phía máy chủ, được giải thích ở nửa dưới của bài viết thứ 2 (mục mà bạn đã liên kết hướng tới).

Hi vọng điêu nay co ich :)


Chỉ cần làm rõ - bằng "bước" Tôi có nghĩa là "khung", chạy 60 lần một giây. Tôi gọi đó là bước (và không phải khung) để phân biệt tiến trình trò chơi thực tế với kết xuất, và lý tưởng là cả hai đều được đồng bộ hóa ở tốc độ 60 mỗi giây. Tôi đã triển khai phiên bản đối chiếu phía máy chủ của bạn, hoạt động tuyệt vời. Câu hỏi này chỉ đề cập đến tàu người chơi - liên tục di chuyển bất kể lệnh của người chơi (do chèn). Đó là nơi khó khăn của tôi nằm. Bạn có suy nghĩ gì về điều đó không? :)
OpherV

Khung khác với các bước. Các bước di chuyển theo thứ tự liên tục, có thể dự đoán. Các khung di chuyển một lượng thời gian khác nhau, do đó, bất kỳ sự tiến triển nào cũng phải được nhân với thời gian delta cho khung đó.
Tealr

@Tealr thực sự, đó là lý do tại sao tôi sử dụng thuật ngữ "bước" để bắt đầu - Tôi chỉ muốn làm rõ hơn rằng việc sử dụng "bước" không bị giới hạn trong các trò chơi theo lượt và trong trò chơi của tôi, bước này chỉ mất 1 / 60 của một giây bất kể kết xuất.
OpherV

Chỉ cần một cái gì đó tôi lưu ý cho thử nghiệm của riêng tôi: 1 / 60s. nhanh một cách bất thường và tôi cá rằng hầu hết các trò chơi trực tuyến có nhiều người tham gia hơn 1x1 đều hoạt động ở mức 1/10 giây. cập nhật hoặc ở đó.
Patrick Hughes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.