Каковы наилучшие способы сериализации и нессериализации сетевых сообщений для многопользовательской игры C /C ++?

Мы используем JSON прямо сейчас и хотим перейти в двоичный формат для некоторых типов сообщений между клиентом и сервером.

Должен ли я просто читать структуры в сокет? Использовать буферы /бережливость proticol?

Как я должен представлять массивы данных?

Как выглядит интерфейс для упаковки /распаковки данных?

10 голосов | спросил HaltingState 31 AM00000080000005631 2011, 08:32:56

2 ответа


12

Предполагая, что ...

  1. вы говорите о преобразовании в буфер байтов
  2. Вы используете UDP, а производительность - проблема.

Старайтесь не тратить пространство в своем пакете для определения структуры. И.Е. отправьте, как минимум, байт, чтобы обозначить тип пакета, а затем предположим, что каждый полученный пакет следует за предопределенной структурой для этого типа пакета

  

Должен ли я просто читать структуры в сокет? Использовать протикол   буферы /бережливость?

  • Да, прочитайте всю структуру, если вам нужна вся структура
  • Нет, сделайте структуру пакета самостоятельно, это будет, конечно, меньше, чем сериализация с использованием этих методов; вы должны точно знать, какие данные должен включать пакет
  

Как я должен представлять массивы данных?

  • Как массивы данных. При получении продолжения чтения буфера до конца данных, чтобы избежать отправки количества элементов массива.
  

Как выглядит интерфейс для упаковки /распаковки данных?

  • Вы можете легко настроить множество методов для преобразования базовых типов в байты, оттуда создайте эти методы для преобразования настраиваемых типов. Специфика , как сделать это можно найти почти везде, где я уверен (я использую C # лично)

Последнее, размер пакета - это , особенно для моментального снимка: size = packetSize x entity x connectedPlayers; Таким образом, у вас может быть 60 x 10 x 16 = 9,600 байт на пакет Затем отправляя это 20 раз в секунду: = 192 000 бит /с = 187 Кбит /с. Это, очевидно, высокая скорость загрузки. Таким образом, необходимо минимизировать каждый из факторов, способствующих размеру пакета, где это возможно.

Эта статья очень помогла мне: Многопользовательская сеть Valve

ответил indeed005 31 AM000000110000005331 2011, 11:55:53
1

Эта проблема была решена Google и Facebook:

  1. Буферы протокола Google - Google - большой пользователь C ++:

      

    Буферы протокола - это способ кодирования структурированных данных в эффективном, но расширяемом формате. Google использует протокольные буферы практически для всех своих внутренних протоколов RPC и форматов файлов.

  2. Apache Thrift (ранее Facebook):

      

    Thrift - это программная среда для масштабируемых межязыковых сервисов. Он объединяет стек программного обеспечения с механизмом генерации кода для создания сервисов, которые работают эффективно и плавно между C ++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C #, Cocoa, JavaScript, Node.js, Smalltalk и OCaml.

ответил a paid nerd 2 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 02 Sep 2011 21:07:44 +0400 2011, 21:07:44

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132