Nội suy các vị trí trong trò chơi nhiều người chơi


14

Để tiết kiệm băng thông trong trò chơi nhiều người chơi của tôi , tôi không cập nhật mọi đối tượng mỗi lần đánh dấu máy chủ, thay vào đó mỗi đối tượng có một updateRate thông báo cho trò chơi rằng đối tượng này dự kiến ​​sẽ được cập nhật mỗi lần đánh dấu máy chủ X.

Khi tôi nhận được thông báo cập nhật cho một đối tượng, tôi tính thời gian tôi mong đợi bản cập nhật tiếp theo xuất hiện:

origin = serverCurrentPosition
diff = serverNextPosition - origin
arriveTime = now + timeBetweenTicks * updateRate

Khi tôi vẽ đối tượng, tôi tính thời gian còn lại cho đến lần cập nhật tiếp theo và nội suy vị trí tương ứng:

step = 100 / timeBetweenTicks * updateRate
delta = 1 - step * ((arriveTime - now) / 100)
position = origin + diff * delta

Nó hoạt động ... nhưng vẫn còn một chút jitter trong bản vẽ, mặc dù trong lý thuyết của tôi, mọi thứ sẽ hoạt động tốt, vì việc chia tỷ lệ sẽ xử lý một số độ trễ, phải không?

Vì vậy, câu hỏi ở đây là, đây có phải là cách tiếp cận tốt nhất? Tôi có nên đặt độ trễ thực tế vào tính toán? Nếu vậy, làm thế nào tôi làm điều đó? Tôi đã làm một số thử nghiệm, nhưng jitter chỉ trở nên tồi tệ hơn.


Xin chào Ivo. Tôi nghĩ rằng đây là một chủ đề hay, nhưng không rõ mã của bạn đang làm gì - ví dụ như serverCienPocation, serverNextPocation, timeB AmongTicks đến từ đâu?
CiscoIPPhone

Đó là gửi dữ liệu cập nhật đến từ máy chủ.
Ivo Wetzel

Câu trả lời:


11

Bạn có jitter, bởi vì bạn đang thay đổi liên tục. Điều này có nghĩa là, trong khi máy chủ gửi các bản cập nhật chính xác cho mỗi tích timeBetweenTickstắc, thì máy khách sẽ nhận được chúng sau một thời gian thay đổi. Thời gian đó có thể gần với timeBetweenTicksmột kết nối tốt, nhưng không chính xác bằng (Và bên cạnh đó, bạn có thể có độ trễ của máy chủ và tốc độ xung nhịp khác nhau trên máy chủ và máy khách).

Vì vậy, khi bạn dựa vào việc nhận được bản cập nhật trong thời gian chính xác, bạn liên tục đến đích một chút trước / sau khi cập nhật thực tế. Do đó, jitter.

Cách tiếp cận đơn giản để giảm jitter là sử dụng "dải cao su", đó là những gì Martin gợi ý trong một câu trả lời khác. Về cơ bản, khi bạn nhận được cập nhật, bạn không ngay lập tức thay đổi vị trí của đối tượng. Thay vào đó, nếu vị trí máy khách và vị trí máy chủ chỉ khác nhau một chút, bạn bắt đầu nội suy vị trí máy khách, để sau một thời gian xác định (giả sử, giữa chừng để cập nhật tiếp theo) vị trí máy khách và máy chủ sẽ hội tụ.

Một ý tưởng khác để giảm jitter trong thiết lập của bạn: vì bạn truyền cả tọa độ "hiện tại" và "tiếp theo", bạn có thể tính toán vận tốc của đối tượng. Sau đó, khi cập nhật độ trễ, bạn không dừng đối tượng tại đích của nó (tức là vị trí "tiếp theo"), nhưng tiếp tục di chuyển nó với cùng vận tốc. Nếu các đối tượng của bạn không thay đổi tốc độ đột ngột, điều này thực sự sẽ cải thiện độ mượt của chuyển động trên máy khách.


Đã vậy, các đối tượng không dừng lại, họ tiếp tục di chuyển cho đến khi nhận được bản cập nhật tiếp theo. Ngoài ra, sử dụng Tăng tốc phần cứng trên khung vẽ HTML dường như làm giảm hiệu ứng jitter khá nhiều. Có lẽ tôi đã phát điên sau khi làm việc với điều đó quá lâu.
Ivo Wetzel

Điều đó hoàn toàn có thể. Nếu bật tăng tốc làm cho tốc độ khung hình cao hơn, thì xác suất xử lý thông tin cập nhật vào đúng thời điểm sẽ tăng.
Không bao giờ bắt đầu

9

Tôi đã giải quyết vấn đề này trước đây với một số thành công với cách tiếp cận mà tôi gọi là "bóng mạng". Tôi không biết đây có phải là điều người khác làm không, nhưng nó luôn làm việc cho tôi.

Mỗi thực thể đang được đồng bộ hóa trên mạng có một thực thể bóng mạng vô hình. Khi một bản cập nhật đến từ mạng, bạn dịch chuyển bóng trực tiếp đến vị trí mà mạng nói rằng nó sẽ ở đó, sau đó bạn từ từ nội suy thực thể nhìn thấy cục bộ về phía bóng theo thời gian.

Tôi đã bao gồm rất nhiều chi tiết về phương pháp này trong câu trả lời trước đây của tôi ở đây


Hừm, tôi đã làm một cái gì đó giống như vậy trong một phiên bản trước đó, sự thiếu chính xác của dấu phẩy động khiến nó thực sự tồi tệ, tôi có thời gian khá lớn khi cập nhật các bản cập nhật, lên tới 300ms cho một số đối tượng, nhưng có lẽ tôi đã làm sai, tôi sẽ cung cấp cho nó một shot khi tôi tìm thấy thời gian rảnh :)
Ivo Wetzel

độ chính xác điểm nổi thực sự không nên đi vào điều này cả! Bạn đã đọc câu trả lời được liên kết của tôi trên stackoverflow? Nó bao gồm tất cả các chi tiết của việc thực hiện loại điều này.
Martin

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.