Каковы наилучшие способы сериализации и нессериализации сетевых сообщений для многопользовательской игры C /C ++?
Мы используем JSON прямо сейчас и хотим перейти в двоичный формат для некоторых типов сообщений между клиентом и сервером.
Должен ли я просто читать структуры в сокет? Использовать буферы /бережливость proticol?
Как я должен представлять массивы данных?
Как выглядит интерфейс для упаковки /распаковки данных?
2 ответа
Предполагая, что ...
- вы говорите о преобразовании в буфер байтов
- Вы используете UDP, а производительность - проблема.
Старайтесь не тратить пространство в своем пакете для определения структуры. И.Е. отправьте, как минимум, байт, чтобы обозначить тип пакета, а затем предположим, что каждый полученный пакет следует за предопределенной структурой для этого типа пакета
Должен ли я просто читать структуры в сокет? Использовать протикол буферы /бережливость?
- Да, прочитайте всю структуру, если вам нужна вся структура
- Нет, сделайте структуру пакета самостоятельно, это будет, конечно, меньше, чем сериализация с использованием этих методов; вы должны точно знать, какие данные должен включать пакет
Как я должен представлять массивы данных?
- Как массивы данных. При получении продолжения чтения буфера до конца данных, чтобы избежать отправки количества элементов массива.
Как выглядит интерфейс для упаковки /распаковки данных?
- Вы можете легко настроить множество методов для преобразования базовых типов в байты, оттуда создайте эти методы для преобразования настраиваемых типов. Специфика , как сделать это можно найти почти везде, где я уверен (я использую C # лично)
Последнее, размер пакета - это , особенно для моментального снимка: size = packetSize x entity x connectedPlayers; Таким образом, у вас может быть 60 x 10 x 16 = 9,600 байт на пакет Затем отправляя это 20 раз в секунду: = 192 000 бит /с = 187 Кбит /с. Это, очевидно, высокая скорость загрузки. Таким образом, необходимо минимизировать каждый из факторов, способствующих размеру пакета, где это возможно.
Эта статья очень помогла мне: Многопользовательская сеть Valve
Эта проблема была решена Google и Facebook:
-
Буферы протокола Google - Google - большой пользователь C ++:
Буферы протокола - это способ кодирования структурированных данных в эффективном, но расширяемом формате. Google использует протокольные буферы практически для всех своих внутренних протоколов RPC и форматов файлов.
-
Apache Thrift (ранее Facebook):
Thrift - это программная среда для масштабируемых межязыковых сервисов. Он объединяет стек программного обеспечения с механизмом генерации кода для создания сервисов, которые работают эффективно и плавно между C ++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C #, Cocoa, JavaScript, Node.js, Smalltalk и OCaml.