Gửi gì đến máy chủ trong game FPS thời gian thực?


23

Cách đúng để nói vị trí của người chơi cục bộ của chúng tôi với máy chủ là gì? Một số tài liệu nói rằng tốt hơn là gửi đầu vào bất cứ khi nào chúng được sản xuất. Và một số tài liệu nói rằng khách hàng gửi vị trí của nó trong một khoảng thời gian cố định.

Với cách tiếp cận gửi đầu vào: Tôi nên làm gì nếu người chơi đang giữ phím điều hướng? Nó có nghĩa là tôi cần gửi một gói đến máy chủ trong mỗi khung. Có quá nhiều không? Và cũng có vòng quay của người chơi từ đầu vào chuột. Đây là một ví dụ:

http://www.gabrielgambetta.com/fpm_live.html

Điều gì về việc gửi vị trí trong cách tiếp cận khoảng thời gian cố định. Nó gửi quá ít tin nhắn đến máy chủ. Nhưng nó cũng làm giảm khả năng phản hồi.

Vậy cách nào tốt hơn?

Câu trả lời:


19

Câu trả lời đơn giản: gian lận hoặc không chính xác!

Nếu bạn đã chơi một số game bắn súng trực tuyến, rất có thể bạn đã trải nghiệm cái gọi là "dải cao su" nếu kết nối của bạn với máy chủ không tốt.

Điều này được gây ra bởi khách hàng của bạn thỉnh thoảng sửa vị trí của bạn.

Về cơ bản, những gì xảy ra ở hai bên:

  • Máy chủ sẽ theo dõi chuyển động của bạn và gửi thông tin cập nhật cho khách hàng như mong đợi. Chúng không phải luôn luôn được cập nhật đầy đủ. Mỗi khung x có thể có một bản cập nhật đầy đủ, tất cả các khung khác bạn chỉ gửi vectơ vận tốc mới (nếu có bất kỳ thay đổi nào).

  • Khách hàng của riêng bạn sẽ cho phép bạn di chuyển tự do nhưng sẽ sử dụng các bản cập nhật do máy chủ cung cấp để sửa / điều chỉnh vị trí của bạn. Điều này sẽ đảm bảo trò chơi cảm thấy nhạy, ngay cả khi bạn không cập nhật khung vị trí theo từng khung.

Nhưng đầu vào được xử lý như thế nào? Khách hàng của bạn sẽ gửi vị trí của bạn đến máy chủ "Tôi đã chuyển đến đó." Máy chủ sẽ xác minh bản cập nhật này (ví dụ: bạn có thể di chuyển đến đó nhanh không?) Và nếu nó hợp lệ di chuyển bạn (hoặc từ chối bản cập nhật của bạn, dẫn đến "dải cao su").

Vì vậy, có, cách tiếp cận khoảng thời gian cố định của bạn rất có thể sẽ làm việc và là đủ.

Nhưng ngay cả khi bạn muốn gửi đầu vào và xử lý chuyển động ở cả hai bên, hãy nhớ rằng bạn không phải gửi "nút vẫn được nhấn". Thay vào đó, hãy gửi một sự kiện khi nhấn nút và một sự kiện khác sau khi nút được phát hành.


5
Có tôi có thể theo dõi báo chí và phát hành nút. Nhưng những gì về đầu vào chuột? Nó liên tục thay đổi.
thánh

6
"Thay vào đó, hãy gửi một sự kiện khi nhấn nút và một sự kiện khác sau khi nút được phát hành." - Đúng, nhưng cần phải kiểm tra tại chỗ để đảm bảo rằng sự kiện "phát hành" cuối cùng sẽ bị ép buộc, tùy thuộc vào quy tắc của trò chơi. Ví dụ, trong phần nhiều người chơi Rainbow Six Vegas 2 , người chơi có thể bắt đầu xả súng và một lỗi (không may phổ biến) khiến thông báo "ngừng bắn" không đến được máy chủ. Điều này dẫn đến âm thanh tiếng súng còn lại trong một vòng lặp vô hạn cho phần còn lại của trận đấu. Chỉ cần một ví dụ để cảnh giác. youtu.be/GOQIbLCy7m8?t=9m10s
Mike Baxter

@syloc: Chỉ cần xử lý phía máy khách và để máy chủ xác định xem chuyển động có hợp lệ / có thể không (để ngăn chặn các nội dung như hack dịch chuyển tức thời và tương tự).
Mario

@syloc Chỉ cần đặt một khoảng thời gian cho chuột, nhưng để tiết kiệm thêm băng thông, hãy kiểm tra phía máy khách để xem nó có thay đổi không. Nếu có một khoảng thời gian không có chuyển động chuột, bạn không cần phải gửi tin nhắn về nó.
agweber

Tại một trong những công việc của tôi, chúng tôi đã có một kỹ sư thực tế tự lái mình điên cuồng tối ưu hóa hành vi mùa xuân cho các cập nhật vị trí bị bỏ lỡ để quay số (13 năm trước). Bây giờ tôi thấy các trò chơi có nhiều băng thông và độ trễ thấp đến mức nực cười vì vấn đề này, dường như vấn đề sẽ không bao giờ biến mất hoặc mọi người ít quan tâm đến nó ngày nay.
Andon M. Coleman

5

Nếu bạn chưa có, tôi khuyên bạn nên đọc hai bài viết sâu sắc nhưng dễ hiểu này: https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networkinghttp://fabiensanglard.net/quake3/network.php .

Những điều này giải thích tại sao nên sử dụng gửi gói 'khoảng thời gian cố định'. Nói ngắn gọn, trên thực tế, điều này chủ yếu quan trọng đối với các gói được gửi bởi máy chủ.

Gửi một gói có chi phí cố định và kích thước tối đa của gói mạng là khoảng 1,5 KB. Vì vậy, nếu bạn có 16 người chơi trên máy chủ của mình, mỗi khung hình khi bạn tính toán chuyển động cho một người chơi, mã ngây thơ có thể gửi một gói cập nhật cho mỗi người chơi sau mỗi độ phân giải chuyển động, vì vậy 16 * 16 = 256 gói. Nếu bạn có tốc độ khung hình là 30, thì đó là 7680 gói.

Một cách tiếp cận tốt hơn, là tạo một bộ đệm trong mỗi đầu khung, nối vào đó cập nhật 16 vị trí được tính toán của bạn và sau đó gửi chúng cho 16 người chơi của bạn.

Bây giờ bạn chỉ gửi 480 gói theo giây cho kết quả tương tự.

Trong trường hợp người chơi đến máy chủ, điều đó chỉ có nghĩa là bạn nên gửi, trong cùng một gói dữ liệu tối đa, như; nhìn vị trí, hành động được gọi là khung này và như vậy.

Về phần thứ hai của câu hỏi của bạn - cách tôi chọn để giảm cảm giác trễ là gửi thông tin này đến máy chủ trên mỗi khung:

  • vị trí hiện tại của người chơi (được máy chủ sử dụng để kiểm tra xem vị trí phía máy chủ và phía người chơi không bị đồng bộ hóa quá nhiều).

  • Vị trí người chơi ước tính trong 1 giây: được tính bởi khách hàng: nếu người chơi không thay đổi hướng chuột và để bàn phím ở trạng thái hiện tại trong 1 giây thì người chơi sẽ ở đâu? (chúng tôi không quan tâm đến va chạm) Nếu người chơi không di chuyển, thì vị trí ước tính của anh ta trong 1 giây là vị trí hiện tại.

  • Vị trí anh nhìn vào.

Mỗi lần máy chủ nhận được thông tin này, nó sẽ cập nhật vị trí trong tương lai và vị trí nhìn, và cuối cùng thực thể người chơi sẽ tiến tới vị trí tương lai.

Người chơi không bao giờ được đồng bộ hóa chính xác, nhưng phản hồi đầu vào là tức thời (quan trọng nhất đối với tôi) và tôi thấy các vị trí dự đoán là đủ chính xác đối với tôi.


"Người chơi không bao giờ được đồng bộ hóa chính xác" Tôi nghĩ điều quan trọng cần đề cập là mức độ chính xác ở đây phụ thuộc vào trò chơi thực tế (chơi). Ví dụ, một MMO cổ điển nơi bạn chỉ cần nhấp và chọn các thực thể, sẽ không cần độ chính xác hoàn hảo cho hầu hết mọi thứ, nhưng trong một game bắn súng tốt để đồng bộ hóa hoàn hảo là điều cần thiết.
Mario

Điều quan trọng là, không ai trong tâm trí của họ sử dụng TCP cho FPS. Họ thà đối phó với việc sắp xếp lại thứ tự phức tạp và các datagram bị bỏ lỡ hơn là phải chịu chi phí hoạt động của TCP.
Andon M. Coleman
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.