2010-10-18 25 views
6

Tôi đang làm cho một trò chơi nhiều người trong C++:Cập nhật tần số tối ưu cho một máy chủ của khách hàng dựa trên nhiều trò chơi

Các khách hàng chỉ đơn giản là lấy lệnh từ người dùng, tính toán vị trí mới máy nghe nhạc của họ và giao tiếp nó tới máy chủ. Máy chủ chấp nhận các cập nhật vị trí như vậy từ tất cả các máy khách và phát sóng giống nhau về từng cái. Trong một kịch bản như vậy, những thông số nào nên xác định khoảng cách thời gian giữa các bản cập nhật liên tiếp (tôi không muốn cập nhật quá nhiều, do đó nghẹn n/w). Tôi đã suy nghĩ, ping tối đa trong số các khách hàng nên là một trong những tham số đóng góp.

Thứ hai, làm cách nào để xác định ping/độ trễ này của khách hàng? Các chủ đề khác trên diễn đàn này đề xuất sử dụng "ổ cắm thô" hoặc sử dụng lệnh ping của hệ thống và thu thập kết quả từ tệp .. có nghĩa là họ sử dụng một cái gì đó như system('ping "client ip add" > file') hoặc forking và exec'ing lệnh ping ..

+4

Trước hết khái niệm cơ bản của bạn là thiếu sót. Gửi các COMMANDS đến máy chủ, KHÔNG phải các vị trí. Nếu không, bạn sẽ kết thúc với nhiều gian lận hơn bạn có thể nghĩ đến. Thứ hai, tỷ lệ cập nhật phụ thuộc vào loại trò chơi của bạn trong trường hợp của tôi http://github.com/BonsaiDen/NodeGame-Shooter điều, 50-300ms là đủ. Các khoảng thời gian lớn hơn giữa các bản cập nhật của bạn nội suy hơn bạn sẽ phải làm. –

+0

Ivo, ur phải, có rất nhiều phạm vi cho khách hàng gian lận nếu tôi gửi các vị trí, nhưng tôi figured, rằng kể từ im sử dụng UDP để gửi các gói cập nhật, nếu "vị trí" cập nhật bị mất trong quá cảnh sau đó thiệt hại cho trò chơi sẽ không nghiêm trọng như thể các bản cập nhật 'commans' bị mất, trong trường hợp bị bệnh cũng phải tiếp tục đồng bộ hóa thường xuyên với từng khách hàng vị trí chính xác của họ ... Có phải bạn cũng gợi ý rằng tần suất cập nhật không phải là chức năng của hiệu suất mạng (ví dụ nếu mạng được tải nặng/tương đối miễn phí)? – AnkurVj

+0

Tôi dựa vào tần suất ping của người chơi, điều đó sẽ dễ dàng cho một số người làm chậm toàn bộ trò chơi bằng cách tăng số lần ping của anh ấy. Bạn đã thực hiện một số thử nghiệm chưa? UDP có phải là yêu cầu cơ bản không? Điều gì về công cụ không vị trí? Giống như kích hoạt, truyền, nhấp vào Giao diện người dùng. Bạn có muốn sử dụng UDP cho điều đó không? Bạn sẽ kết thúc với rất nhiều logic phía khách hàng và tấn mã xác thực phía máy chủ điên theo cách này. –

Trả lời

4

Câu trả lời này sẽ tùy thuộc vào loại trò chơi nhiều người bạn đang nói đến. Có vẻ như bạn đang nói về trò chơi loại mmo. Nếu trường hợp này xảy ra thì sẽ có ý nghĩa khi sử dụng 'kênh tạm thời', về cơ bản có nghĩa là khách hàng có thể tạo nhiều gói chuyển động mỗi giây, nhưng chỉ các gói chuyển động mới nhất được gửi đến máy chủ. Nếu bạn sử dụng một kỹ thuật như thế này thì bạn nên căn cứ vào tốc độ cập nhật của bạn trên tốc độ mà người chơi di chuyển trong trò chơi. Bằng cách này, bạn có thể đảm bảo rằng người chơi không trượt qua tường hoặc chạy qua một kích hoạt quá nhanh. Câu hỏi thứ hai của bạn tôi sẽ sử dụng boost :: asio để thiết lập một dịch vụ mà khách hàng của bạn có thể 'ping' bằng cách gửi một gói đơn giản, sau đó dịch vụ sẽ gửi lại thông điệp cho khách hàng và bạn có thể xác định thời gian đã lấy lại gói tin.

+0

gợi ý làm cho rất nhiều ý nghĩa .. Tuy nhiên trong kịch bản của tôi điều này không thực sự làm việc .. Trong trò chơi của tôi, khách hàng gửi vị trí của người chơi, máy chủ, cũng thực hiện một số tính toán dựa trên vị trí này và vị trí của người chơi khác và các vật thể khác trong cảnh. Nếu khách hàng chỉ gửi một số upadtes vị trí, thì máy chủ không luôn biết vị trí chính xác của khách hàng và do đó có thể thực hiện tính toán kết hợp – AnkurVj

+2

@AnkurVj: Tại sao khách hàng gửi vị trí của người chơi? Có một số yêu cầu bất thường ở đây? Thông thường, máy khách gửi các lệnh của người chơi và máy chủ xác định những thứ như vị trí. Nếu không, mọi người sẽ tấn công khách hàng hoặc kết nối để cho phép họ ở bất cứ đâu họ thích. –

+1

@ David Thornley: Bạn hoàn toàn đúng, người chơi có thể dễ dàng hack khách hàng của họ hoặc làm những việc như hack tốc độ dễ dàng nhất. @AnkurVj: bạn có thể suy nghĩ lại về thiết kế của mình, máy chủ thực sự cần phải là cơ quan cuối cùng về vị trí của người chơi. –

0

Nếu bạn sẽ kết thúc làm công cụ gói dữ liệu thô, bạn cũng có thể cuộn gói ICMP của riêng mình; cấu trúc là tầm thường (http://en.wikipedia.org/wiki/Ping).

0

Thư viện enet thực hiện rất nhiều kết nối mạng cho bạn. Nó cũng tính thời gian chờ.

+0

Tôi không thực sự muốn sử dụng thư viện cho một tính năng đơn lẻ. – AnkurVj

Các vấn đề liên quan