Các cách tốt nhất để tuần tự hóa và hủy đăng ký tin nhắn mạng cho trò chơi nhiều người chơi C / C ++ là gì?


11

Chúng tôi đang sử dụng JSON ngay bây giờ và muốn chuyển sang định dạng nhị phân cho một số loại thông báo giữa máy khách và máy chủ.

Tôi có nên đọc cấu trúc vào ổ cắm không? Sử dụng bộ đệm proticol / tiết kiệm?

Làm thế nào tôi nên đại diện cho mảng dữ liệu?

Giao diện nên trông như thế nào để đóng gói / giải nén dữ liệu?

Câu trả lời:


12

Giả định...

  1. bạn đang nói về việc chuyển đổi sang bộ đệm byte
  2. Bạn đang sử dụng UDP và hiệu suất là một mối quan tâm

Cố gắng tránh lãng phí không gian trong gói của bạn để xác định cấu trúc. Tối thiểu IE gửi một byte để biểu thị loại gói, sau đó chỉ giả sử mỗi gói nhận được theo cấu trúc được xác định trước cho loại gói đó

Tôi có nên đọc cấu trúc vào ổ cắm không? Sử dụng bộ đệm proticol / tiết kiệm?

  • Có, đọc toàn bộ cấu trúc NẾU bạn CẦN toàn bộ cấu trúc
  • Không, tự tạo cấu trúc gói, Điều này chắc chắn sẽ nhỏ hơn việc tuần tự hóa bằng các phương thức này; bạn nên biết chính xác dữ liệu mà gói nên bao gồm

Làm thế nào tôi nên đại diện cho mảng dữ liệu?

  • Là mảng dữ liệu. Khi nhận tiếp tục đọc bộ đệm cho đến khi hết dữ liệu để tránh gửi Đếm các phần tử của mảng

Giao diện nên trông như thế nào để đóng gói / giải nén dữ liệu?

  • Bạn có thể dễ dàng thiết lập một loạt các phương thức để chuyển đổi các loại cơ bản thành byte, từ đó xây dựng các phương thức này để chuyển đổi các loại tùy chỉnh. Các chi tiết cụ thể về cách thực hiện việc này có thể được tìm thấy ở hầu hết mọi nơi tôi chắc chắn (tôi sử dụng C # cá nhân)

Một điều cuối cùng, kích thước gói một mối quan tâm, đặc biệt đối với ảnh chụp nhanh: size = packSize x entity x ConnPlayers; Vì vậy, bạn có thể có 60 x 10 x 16 = 9.600 byte mỗi gói Sau đó gửi 20 lần một giây: = 192.000 bps = 187 KBps. Đây rõ ràng là một tốc độ tải lên cao. Do đó, cần phải giảm thiểu từng yếu tố góp phần vào kích thước gói nếu có thể.

Bài viết này đã giúp tôi rất nhiều: Mạng nhiều người chơi Valve


Một bài viết khác mà tôi đã phát hiện ra trong khi đọc các câu hỏi nối tiếp đối tượng và nối mạng khác nhau ở đây vài tuần trước là bài viết này mô tả cách thức công cụ Unreal thực hiện nó. Một điểm tốt để so sánh cho nguồn Valve.
Martin Foot

1
Phương pháp mảng của bạn sẽ không hoạt động trong trường hợp chung - 'phần cuối của dữ liệu' nằm ở đâu? Ngay cả khi tin nhắn của bạn được phân định, điều đó có nghĩa là bạn không thể có nhiều hơn 1 mảng trên mỗi cấu trúc. Để khắc phục điều này, người đăng ban đầu có thể dính vào các mảng có chiều dài cố định hoặc đảm bảo chỉ có 1 mảng trên mỗi cấu trúc (ở cuối cấu trúc) hoặc gửi giá trị đếm khi bắt đầu mảng.
Kylotan

Chỉ một lời khuyên nữa: Hãy nhớ điều trị endianess, điều này có thể rất đáng lo ngại nếu bạn không biết rằng điều đó tồn tại.

Điểm hay @Kylotan, đồng ý rằng trong một số trường hợp, dữ liệu bổ sung này không thể tránh được; nhưng nếu tôi thấy mình thêm nhiều mảng vào một gói, tôi sẽ xem xét gửi nhiều gói thay vào đó
thực sự là

1

Vấn đề này đã được Google và Facebook giải quyết:

  1. Bộ đệm giao thức của Google - Google là một người dùng lớn của C ++:

    Bộ đệm giao thức là một cách mã hóa dữ liệu có cấu trúc theo định dạng hiệu quả nhưng có thể mở rộng. Google sử dụng Bộ đệm giao thức cho hầu hết tất cả các giao thức RPC và định dạng tệp bên trong.

  2. Apache Thrift (trước đây là Facebook):

    Thrift là một khung phần mềm để phát triển dịch vụ đa ngôn ngữ có thể mở rộng. Nó kết hợp một ngăn xếp phần mềm với một công cụ tạo mã để xây dựng các dịch vụ hoạt động hiệu quả và liền mạch giữa C ++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C #, Ca cao, JavaScript, Node.js, Smalltalk và OCaml.


Bộ đệm Giao thức của Google quá chậm so với các trò chơi thời gian thực quy mô lớn hơn. Tuy nhiên, tôi thấy chúng khá đẹp khi tạo mẫu và số lượng người chơi nhỏ hơn do phiên bản. Như thường lệ, hồ sơ của bạn sẽ kể câu chuyện thực sự.
Patrick Hughes

Chà, chúng đủ tốt cho Google và Google có quy mô khá tốt và chúng hoạt động tốt khi tôi sử dụng chúng. Đó là lý do tại sao tôi khuyên họ.
một mọt sách được trả tiền

Google không yêu cầu hiệu suất thời gian thực. Google yêu cầu độ tin cậy và thời gian hoạt động, cả hai đều được Bộ đệm giao thức phục vụ tốt. Sự phức tạp của tất cả các phiên bản dự phòng và tạo mã soạn thảo dự phòng sẽ thêm chi phí và khi bạn gửi và nhận 1000 bản cập nhật trong khoảng thời gian 50-100msec thì nó cộng lại. Cấu hình bộ đệm Giao thức một số phiên bản cũ so với bộ nối tiếp được mã hóa cụ thể cho dữ liệu hiện có. @ thật005 có ý chính của nó.
Patrick Hughes

+1, vì mặc dù các định dạng này quá lớn và chậm đối với hầu hết các trò chơi thời gian thực hoặc băng thông cao (do chứa thông tin bổ sung cho phép bạn xây dựng lại các gói phức tạp tùy ý), điều đó không có nghĩa là chúng không hữu ích trong một số trò chơi, vd. những người theo lượt. Nếu tối ưu hóa mọi tài nguyên không cần thiết thì các định dạng này có thể giúp bạn tiết kiệm rất nhiều thời gian và chắc chắn chúng hiệu quả hơn JSON.
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.