Đầu vào phía máy chủ


9

Hiện tại trong trò chơi của tôi, máy khách không có gì ngoài trình kết xuất. Khi trạng thái đầu vào được thay đổi, máy khách sẽ gửi một gói đến máy chủ và di chuyển trình phát như thể nó đang xử lý đầu vào, nhưng máy chủ có tiếng nói cuối cùng về vị trí.

Điều này thường hoạt động thực sự tốt, ngoại trừ một vấn đề lớn: rơi ra khỏi các cạnh. Về cơ bản, nếu một người chơi đang đi về phía rìa, nói một vách đá và dừng lại ngay trước khi ra khỏi rìa, đôi khi một giây sau, anh ta sẽ bị dịch chuyển ra khỏi rìa. Điều này là do gói "Tôi đã dừng nhấn W" được gửi sau khi máy chủ xử lý thông tin.

Đây là sơ đồ độ trễ để giúp bạn hiểu ý của tôi: http://i.imgur.com/Prr8K.png

Tôi chỉ có thể gửi gói "W Pressed" cho mỗi khung hình để máy chủ xử lý, nhưng đó có vẻ là một giải pháp tốn kém về băng thông.

Bất kỳ trợ giúp được đánh giá cao!

Câu trả lời:


5

Mặc dù máy chủ có tiếng nói cuối cùng về vị trí, nhưng nó nên thực hiện điều đó bằng cách xác minh và kiểm tra sự tỉnh táo những gì khách hàng gửi qua làm đầu vào và vị trí. Tôi nói điều này bởi vì những gì bạn đang làm là di chuyển người chơi ngay lập tức và kỳ vọng tạo ra trong mã của bạn là máy khách là vị trí thực sự.

Bạn nghĩ rằng nó thường hoạt động tốt, nhưng nó không phải là. Lưu ý bên lề: bạn nói rằng ứng dụng khách của bạn không có gì khác ngoài trình kết xuất, sau đó nhanh chóng cung cấp cho nó quyền kiểm soát cục bộ để di chuyển mà không cần thông báo máy chủ. Bạn không thể có cả hai cách, hoặc đợi máy chủ yêu cầu bạn di chuyển hoặc nắm quyền kiểm soát vị trí của bạn và sử dụng máy chủ để xác minh gian lận.

Tôi lưu ý rằng câu trả lời của bạn đang đạt đến một giây? Đó là độ trễ 500ms, rất lớn đối với bất kỳ loại game hành động nào. Hãy thử tìm hiểu tại sao việc quay vòng này lại mất nhiều thời gian như vậy, nó có thể là bất cứ thứ gì từ hàng đợi lệnh sao lưu từ việc không được xử lý kịp thời đến băng thông bị ngập hoặc thậm chí là quỷ gây ra nhiều gói bị mất.

Điều tôi nghĩ nên xảy ra là

client sends a move + position update
server gets it t+latency time later
server verifies and sends out info to all clients
client receives this at (t+latency + latency)

Phần khó khăn ở đây là nếu một khách hàng nhận được một tin nhắn về chính nó thì chủ yếu nên bỏ qua nó trừ khi tin nhắn đó có nội dung như "di chuyển không hợp lệ, thay vào đó hãy đến XYZ." Nếu thông báo đó dành cho khách hàng của bất kỳ ai khác mà bạn đang nhận được thông tin thì bạn sẽ phải ngoại suy chuyển tiếp theo thời gian để nó có vẻ giống như nơi nó sẽ đến.


Khách hàng hoàn toàn không gửi vị trí của mình; nó chỉ đơn giản là dự đoán / nội suy. Đó là lý do tại sao nó rơi ra khỏi rìa khi nó nghĩ rằng nó ở rìa. Ngoài ra, tôi không thấy nơi tôi nói độ trễ là 1 giây, nó giống như 8ms (thử nghiệm cục bộ) đến 100ms (qua internet). Tôi nói rằng người chơi sẽ được thiết lập lại sau vì tôi định kỳ gửi các bản cập nhật vị trí đầy đủ. Tôi có đúng không khi hiểu rằng tôi nên gửi vị trí mà khách hàng nghĩ là phải, cùng với các phím được nhấn và máy chủ sẽ xác minh xem có khả thi không?
Thomas

"Đôi khi một giây sau, anh ta sẽ bị dịch chuyển tức thời" ngụ ý những sự chậm trễ lớn, đó là nơi tôi có thời gian. Đối với một trò chơi hành động đáp ứng có, khách hàng chơi và máy chủ chơi đúng giờ và cho khách hàng biết nếu nó làm điều gì đó bất hợp pháp. Bạn sẽ nhận thấy trong các trò chơi nhiều người chơi trực tuyến mà bạn chủ yếu thấy người khác thay đổi vị trí (những người đến từ máy chủ) trong khi vị trí của bạn chỉ rất hiếm khi thay đổi từ chỉnh sửa máy chủ trực tiếp. Những người khác thấy bạn thay đổi vị trí, v.v ...
Patrick Hughes

Điều này vẫn không thể khiến người chơi rơi ra khỏi máy chủ chứ? Trừ khi tôi gửi một gói mỗi khung, máy chủ vẫn có thể nghĩ rằng người chơi đang di chuyển trong khoảng 32ms. (Tôi chỉ gửi các gói mỗi ba khung hình). Hoặc bạn đang đề xuất rằng tôi hoàn toàn không mô phỏng đầu vào trên máy chủ, mà chỉ kiểm tra xem vị trí có nằm trong giới hạn của đầu vào được nhấn không?
Thomas

Vì máy chủ chỉ sửa lỗi di chuyển không hợp lệ do khách hàng báo cáo, nên nó sẽ không bao giờ gửi "bạn rơi khỏi vách đá" trừ khi chính khách hàng lái xe ngay sát mép. Trong vòng phản hồi này, máy chủ sẽ tự điều chỉnh theo quan điểm của khách hàng về thế giới và vị trí của anh ta trong đó. Chuyển động sẽ cảm thấy rõ nét và đáp ứng cho người chơi. Các hành động khác như tương tác với các đối tượng thế giới sẽ liên quan đến việc chờ máy chủ báo cho khách hàng biết chuyện gì vừa xảy ra, nhấp vào hộp và chờ phản hồi, nhưng chúng ta chỉ nói về chuyển động ở đây.
Patrick Hughes

Nghe có vẻ giống như những gì tôi đang làm; gửi một vị trí đến máy chủ và yêu cầu máy chủ xác nhận xem người chơi có thể di chuyển đến vị trí đó hay không. Đó dường như là một cách tiếp cận heuristic hơn, và theo tôi sẽ không hiệu quả khi máy chủ quyết định, định kỳ. Sẽ gửi dấu thời gian với mỗi gói làm việc? Tôi nghĩ rằng sẽ xóa bỏ vấn đề. Tôi tin rằng Halo và các trò chơi sử dụng Công cụ nguồn sử dụng điều đó.
Thomas

0

Tôi hiểu bạn hỏi như:

Máy chủ nhận được một gói khi tôi bắt đầu nhấn nút 'chuyển tiếp' và một gói khác khi cuối cùng tôi đã phát hành nút 'chuyển tiếp'. Do đó, chuyển động thực tế trên máy chủ bắt đầu và kết thúc khoảng 100 mili giây 'quá muộn' trong trò chơi thực tế so với những gì người chơi đang thể hiện ở phía khách hàng. Vì vậy, nếu người chơi muốn di chuyển 10 giây, anh ta có thể sẽ di chuyển 10.x giây thay vì x >= 1trực tuyến.

Đây là một chiến lược thiết kế tồi vì nó không thể hiện ý chí của người chơi trong thế giới trò chơi như người chơi dự định, tạo ra trải nghiệm người dùng khá kém.

Giải pháp tôi muốn giới thiệu là gửi một gói (càng thường xuyên càng tốt) cho biết người chơi đã thực hiện bao nhiêu bước và theo hướng nào. Sau đó, máy chủ sẽ cập nhật thế giới trò chơi với vị trí người chơi mới nếu vượt qua kiểm tra tính chính xác. Vì vậy, người chơi có thể di chuyển với độ chính xác cao và tránh rơi ra các gờ cao.

Giải pháp thay thế sẽ là ghi nhớ các vị trí của người chơi trong giây qua và sửa lại vị trí khi nhìn lại thời điểm nút được phát hành. Âm thanh như nó sẽ tạo ra hiệu ứng dây cao su của thời xa xưa. (Chỉ vì một lý do khác)

Vì vậy, về cơ bản, bạn sẽ cần gửi một gói nút nào được nhấn và thời gian trò chơi thực tế mà nút được nhấn và sau đó, nút nào được phát hành và vào thời gian chính xác.


Như tôi đã nói với Patrick, tôi nghĩ rằng giải pháp đó sẽ là một cách tiếp cận heuristic; thay vì máy chủ là "Người đàn ông", máy chủ thay vì kiểm tra tính hợp lệ của dữ liệu khách hàng. Tất nhiên, điều này sẽ phải tạo ra một số chậm trễ để độ trễ hoặc các sự cố mạng khác không tạo ra kết quả dương tính giả.
Thomas
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.