Dấu thời gian trong trò chơi nhiều người chơi


8

Tôi đang cố gắng bọc bộ não của mình xung quanh khái niệm tạo trải nghiệm nhiều người chơi trên máy chủ / máy khách.

Vấn đề của tôi chủ yếu liên quan đến dấu thời gian. Hãy xem xét kịch bản sau đây:

Một khách hàng kết nối với một máy chủ. Máy khách gửi đầu vào của mình đến máy chủ để cho biết anh ta muốn di chuyển. Máy chủ mô phỏng đầu vào và xác định vị trí của khách hàng đó trong thế giới trò chơi.

Vì cả máy khách và máy chủ đều chạy trên các dấu thời gian khác nhau, làm thế nào để bạn mô phỏng chính xác để tất cả các máy khách được đồng bộ hóa với máy chủ? Máy chủ của tôi hiện được đặt ở tốc độ 30ms. Khi tôi xử lý các chuyển động của máy khách, có khả năng hàng trăm yêu cầu đang chờ xử lý, nhưng không có cách nào để cho biết mất bao lâu giữa mỗi yêu cầu.

Tôi thực sự không nắm bắt được cách mô phỏng đúng trên máy chủ dựa trên thời gian, để mọi thứ được đồng bộ hóa.



3
Bạn cũng có thể thử các liên kết này: Gaffer nhiều người chơi
nhịp

Câu trả lời:


3

Nói một cách đơn giản, bạn cần gửi một dấu thời gian với mỗi ảnh chụp nhanh từ máy chủ và với mỗi đầu vào từ máy khách.

Ở cả hai đầu, bạn cần một quy trình để "điền" bất kỳ khung nào mà các gói không được nhận.

Trong trò chơi của tôi (một trò chơi hành động có nhịp độ nhanh - có thể khác), trên máy chủ, tôi loại bỏ mọi đầu vào "cũ" (không theo thứ tự) và chỉ cần đoán rằng nếu không có gói đầu vào mới nào đến, các nút tương tự chỉ cần giữ phím (có thêm một chút nội dung để đảm bảo các lần nhấn / nhả nút ngắn được xử lý, nhưng đó là tiền đề cơ bản).

Trên máy khách, tôi giữ một "bộ đệm trễ" (được mô tả trong bài viết này mà Tetrad liên kết). Tôi sử dụng trung bình thời gian đến để đảm bảo rằng bộ đệm trễ giữ đúng độ dài - làm cho trò chơi của khách chạy chậm hơn một chút hoặc nhanh hơn để bắt kịp. Nếu ảnh chụp nhanh không đến kịp thì tôi sẽ ngoại suy trên máy khách. Nếu không, tôi nội suy giữa các ảnh chụp nhanh trong bộ đệm.

Máy khách cũng chịu trách nhiệm theo dõi thời gian khứ hồi cho các đầu vào và sử dụng điều đó để dự đoán (máy chủ gửi lại dấu thời gian của đầu vào mà nó đã sử dụng khi tính toán một khung nhất định). Nó đệm các đầu vào trong khoảng thời gian đó, phát lại chúng để đưa vị trí của người chơi từ vị trí "cũ" (trong ảnh chụp nhanh từ máy chủ) đến vị trí "hiện tại" được dự đoán.

Về cơ bản, máy chủ chỉ tiếp tục chạy ở tốc độ khung hình cố định. Nó phụ thuộc vào các máy khách được đồng bộ hóa với máy chủ.

Tất nhiên, đây chỉ là một tổng quan cấp cao. Có rất nhiều chi tiết khó chịu mà bạn phải tìm ra khi thực hiện nó.


Nếu máy chủ nhận được 10 lệnh đầu vào từ máy khách giữa một bước thời gian của máy chủ. Máy chủ thực thi 10 lệnh đầu vào. Làm thế nào để chúng ta biết bao lâu để mô phỏng mỗi lệnh đầu vào? Điều gì sẽ xảy ra nếu bạn chỉ nhận được một lệnh đầu vào, bạn có mô phỏng lệnh đó trong toàn bộ khoảng thời gian của bước thời gian không?
jgallant

1
@Jon Hầu hết các trò chơi "hành động" gửi đầu vào dưới dạng nút lên / xuống trạng thái mỗi khung. Các máy chủ sau đó chỉ cần sử dụng các trạng thái đã nhận mới nhất của nhà nước cho rằng bản cập nhật đánh dấu. Các gói bị rơi, trễ và không theo thứ tự được bỏ qua. (Ít nhất là ở mức cơ bản - ví dụ, bạn có thể thêm thông tin tuần tự bổ sung để trạng thái lên hoặc xuống rất ngắn không bị bỏ qua, ngay cả khi bị hủy.) Đây có lẽ là điều bạn nên làm cho tất cả các đầu vào có thời gian liên quan . Các hành động dựa trên lệnh (ví dụ: "di chuyển đến đây" trong RTS) thường không có thời lượng liên quan - vì vậy bạn chỉ cần thực hiện chúng theo thứ tự.
Andrew Russell
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.