Làm thế nào để dự đoán phía khách hàng làm việc?


33

Tôi đã đọc Valve + Gafferon và hàng trăm trang từ Google, nhưng vì bất kỳ lý do gì tôi không thể hiểu được dự đoán của khách hàng.

Theo hiểu biết của tôi, vấn đề cơ bản là:

  • 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

Tại T2Tuy nhiên, sử dụng dự đoán khách hàng, khách hàng A hiện đang ở một vị trí thích hợp để T4.

Làm thế nào để bạn đảm bảo rằng Khách hàng A, khi dự đoán rằng máy chủ sẽ chấp nhận yêu cầu di chuyển, sẽ không đi trước máy chủ? Rõ ràng là tất cả thời gian họ ở phía trước, điều này dẫn đến việc quay trở lại nơi máy chủ nhìn thấy họ lần cuối. Với tất cả các sửa chữa tôi đã thử, điều này vẫn đáng chú ý khi bạn dừng lại, bởi vì máy chủ dừng phía sau bạn

Câu trả lời:


35

Tôi đã viết một loạt các bài viết về điều này. Nó dựa trên cùng những ý tưởng bạn đã đọc ở nơi khác, nhưng được giải thích một cách rất chi tiết và (tôi hy vọng) có thể truy cập được.

Đặc biệt, bài viết về dự đoán phía khách hàng là bài này .


Những bài viết xuất sắc :-) Tôi rất muốn xem phần thứ tư của bộ truyện. Như một gợi ý nhỏ, một liên kết đến phần tiếp theo ở cuối mỗi bài viết chắc chắn sẽ cải thiện điều hướng.
HOẶC Mapper

5
@ORMapper - Cuối cùng tôi đã viết bài thứ 4! gabrielgambetta.com/fpm4.html
ggambett

Kudos cho loạt bài viết của bạn :-) Rất hữu ích, cảm ơn :-)
HOẶC Mapper

Tất cả các bài viết (tôi có thể tìm thấy) nói về việc xây dựng lại quá khứ bằng cách sử dụng các ảnh chụp nhanh được lưu trữ lấy ví dụ. Điều này có áp dụng cho phong trào là tốt? Tôi có thể tưởng tượng rằng việc mô phỏng lại chuyển động có thể dẫn đến một số khác biệt lớn cho những người chơi khác nếu họ có thể va chạm với nhau. Giả sử hai người chơi di chuyển với nhau và một trong số họ dừng di chuyển vài "bước" từ đó sẽ là điểm va chạm. Lệnh dừng này đến muộn vì độ trễ, vì vậy nếu chúng ta mô phỏng lại thế giới, hai người chơi sẽ ở các vị trí rất khác nhau
Lope 6/11/13

Đó là một câu hỏi thú vị. Thật không may, tôi không có câu trả lời dứt khoát. Tôi đoán nó phụ thuộc vào mức độ quan trọng của các chuyển động cho trò chơi; bạn chỉ va vào người khác và không có gì xảy ra? Trong trường hợp đó, máy chủ có thể không quan tâm, nó được coi là một lỗi dự đoán (tất cả chúng ta đều thấy nó xảy ra ở các điểm bị sặc, phải không?). Bạn có giết người chơi khác khi tiếp xúc không? Trong trường hợp đó, việc làm cho đúng là quan trọng hơn nhiều và có thể đáng để mô phỏng lại. Xin lưu ý rằng tại một số thời điểm, bạn cần loại bỏ một số gói là "quá cũ", nếu không, bạn sẽ có khả năng bắt chước lại từ t = 0 bất cứ lúc nào.
ggambett

4

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.


3
Điều đó hoàn toàn chính xác, ngoại trừ một chút về kết xuất máy khách trong quá khứ. Liên quan đến máy chủ, máy khách thực sự được kết xuất trong tương lai! Máy chủ biết rằng thông tin mà nó có từ mỗi máy khách đã cũ và mỗi máy khách sẽ thay đổi kể từ đó.
Kylotan

2

Trên thực tế, có một triển khai nguồn mở trong github cho thấy cách thức này được thực hiện. Kiểm tra Lance.gg

repith github: https://github.com/lance-gg/lance

Mã dự đoán máy khách được triển khai trong mô-đun gọi là src/syncStrategies/ExtrapolateStrategy.js

Ngoài phép ngoại suy, có hai khái niệm mà tôi không thấy được đề cập ở trên:

  1. Uốn tăng dần. Về cơ bản thay vì áp dụng tất cả các hiệu chỉnh máy chủ cùng một lúc, bạn hãy để delta áp dụng theo từng bước nhỏ. Bằng cách đó, các đối tượng ở xa sẽ dần dần điều chỉnh vị trí của chúng để phù hợp với vị trí máy chủ. Có uốn vị trí, uốn vận tốc, uốn góc và uốn vận tốc góc. Ngoài ra, bạn có thể muốn các yếu tố uốn khác nhau cho các đối tượng khác nhau.
  2. Bước thực hiện lại. Thực tế là dữ liệu trong quá khứ có nghĩa là bạn có thể quay ngược thời gian về thời gian dữ liệu của máy chủ và khởi động lại từ thời điểm đó. Tất nhiên bạn vẫn sẽ cần phải uốn cong về phía vị trí mới tìm thấy, thay vì nhảy tới nó.

1

Máy khách A luôn đi trước máy chủ - nhưng không thành vấn đề. Bạn chỉ phải chụp lại máy khách nếu máy chủ cho biết có sự cố với vị trí được báo cáo, tại thời điểm đó, máy khách sẽ chạy lại tất cả các thay đổi mà nó đã thực hiện do lỗi với các giá trị đã sửa, để đưa nó về trạng thái tương thích với máy chủ.

Để làm điều này, khách hàng cần nhớ một số cập nhật trạng thái trong quá khứ và quá khứ. Đây chỉ có thể là một vài giá trị đơn giản như vị trí, vận tốc, định hướng, loại điều đó. Máy chủ sẽ định kỳ gửi một xác nhận rằng các cập nhật khác nhau của khách hàng là hợp pháp, có nghĩa là giờ đây chúng có thể bị quên khỏi máy khách. Tuy nhiên, nếu máy chủ báo cáo rằng một bản cập nhật không hợp lệ, trạng thái máy khách sẽ quay trở lại điểm đó và những thay đổi trong tương lai sẽ được áp dụng cho trạng thái được sửa đổi đó.

Có một số liên kết bổ sung ở cuối bài viết của Valve rất đáng đọc - đây là một trong số đó: https://developer.valvesoftware.com/wiki/Predtions


Vì vậy, tôi có đúng không khi nghĩ rằng khách hàng (tại t=4) nhận được thông tin về t=2, vì vậy nó đặt lại trạng thái để t=2sau đó chạy lại các bản cập nhật để đưa các đối tượng từ t=2đến t=4?
George Duckett

Tôi vẫn không nắm bắt được nó vì một số lý do. Máy chủ không được cho biết vị trí của người chơi, chỉ có các đầu vào. Vì vậy, người chơi đang di chuyển từ vị trí cuối cùng mà máy chủ cho biết. Đầu vào được áp dụng. Máy chủ được thông báo. Máy chủ xác nhận đầu vào cho mọi người. Giả sử tất cả các lệnh được chấp nhận, máy chủ sẽ vẫn ở phía sau Máy khách A - vì vậy khi Máy khách A dừng, ký tự của nó sẽ dừng ngay lập tức sau đó trượt trở lại vị trí máy chủ khi nhận được xác nhận dừng.
Chris Evans

@GeorgeDuckett: có (mặc dù không phải là t = 4, nhưng có thể là bất cứ khi nào có sự khác biệt được phát hiện và có thể có bất kỳ số lượng cập nhật được áp dụng lại nào.)
Kylotan

@ChrisEvans: trạng thái đã biết + thay đổi dựa trên đầu vào tương đương với trạng thái gửi. Đối với ví dụ dừng, bản thân nó là một đầu vào và máy chủ vẫn đang mô phỏng chuyển động cho đến khi nhận được đầu vào đó. Giả sử độ trễ không đổi, máy chủ sẽ dừng người chơi di chuyển ở chính xác vị trí mà khách hàng nhìn thấy khi anh ta ngừng di chuyển, bởi vì máy khách đã ở phía trước máy chủ. (Trong thế giới thực, độ trễ thay đổi, vì vậy bạn nội suy một chút để làm cho nó mượt mà.)
Kylotan
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.