Язык: C ++
Мой вопрос заключается в следующем: я хотел бы знать, что было бы лучшим или хотя бы хорошим способом для упаковки и отправки данных от клиента к серверу и наоборот. Там будет несколько данных, составляющих один пакет. Пакет будет иметь «идентификатор», который определяет, для чего он предназначен, а затем данные в заранее определенном порядке для того «действия», которому соответствует пакет.
Для менее зависящих от производительности систем я просто отправлял бы строки, которые разделялись бы пробелом, являясь данными «действия» и первым «словом» идентификатора пакета, и просто цепочкой, если операторы проверяли наличие совпадений ,
Теперь для более критической системы, то, что я до сих пор думал, было что-то вроде этого:
Создайте строку с идентификатором пакета и данными и отправьте ее. Затем, чтобы распаковать, я мог бы извлечь первое целое число в строке и, имея массив обработчиков пакетов, с индексами, соответствующими идентификатору пакета, который они обрабатывают, и просто сделать что-то вроде packetHandlers [packetID] .Process (packetData).
Что вы думаете об этом, какие-либо предложения? высоко ценится!
источник
Зачем использовать две разные схемы кодирования? Просто используйте второй для каждой системы. Просто будь проще.
Рассмотрите возможность использования дельта-сжатия. Т.е. отправить одно полное значение и после этого только то, что изменилось. После нескольких итераций игры снова отправьте полную стоимость.
Еще одна кодировка, которую вы можете рассмотреть, - Base 128 Varint. Google Protobufs использует его. Взгляните на страницу «Кодировка» их руководства разработчика: Кодировка буферов протокола Может сэкономить несколько байтов.
источник
Каким может быть пример данных, которые вы отправляете? Я не вижу причин делать что-то чрезмерно причудливое. Как только данные полностью загружены в буфер получателя, проверьте первый
int
на основе его значения, и вы узнаете, как обрабатывать остальные данные.Таким образом , пакет , который состоит из четырех частей данных
id
,val1
,val2
иval2
может выглядеть следующим образом :Когда вы читаете первый байт (который, как вы знаете, всегда будет там), вы решаете, как обрабатывать следующий набор данных. Если первое слово (id) - это
00000001
вы знаете, за ним следуют еще три слова, и это конец пакета. Продолжая пример, вы можете иметь идентификатор =00000010
и ваша спецификация говорит вам , что значение идентификатора 2, вы обрабатываетеfloat
,float
,float
в таком порядке, который мог бы указать позицию игрока в мировом пространстве.Думайте об этом как о написании вашей собственной двоичной файловой системы, у вас есть значение заголовка, которое описывает остальные данные, где они расположены (в каком положении) и к какому типу данных их следует относиться.
источник