Идентификация имени свойства с низким следом

Я хочу отправлять пакеты для синхронизации свойств постоянно меняющихся игровых объектов в игре. Я отправлял уведомления об изменении свойства на стороне сервера объекту EntitySync, который отвечает за отправку обновлений для использования клиентом.

Прямо сейчас я предварительно исправляю имя строки свойства. Это большие накладные расходы, когда вы отправляете много обновлений (положение, HP, угол). Мне нужен полууникальный способ идентифицировать эти пакеты.

Я думал об атрибутах (отражение... медленный?), используя суффикс в конце и отправляя его в качестве идентификатора (Position_A, HP_A), но я не могу найти чистый способ быстро идентифицировать эти свойства с низкой ногой. Распечатать. Он должен потреблять как можно меньше байтов.

Идеи?


person Vaughan Hilts    schedule 10.12.2012    source источник


Ответы (2)


Расширяя объяснение Чарли,

Библиотека protobuf-net, созданная Марком Гравеллом, — это именно то, что вам нужно с точки зрения сериализации. Чтобы уточнить, это библиотека Марка Гравелла, а не Google. Он использует кодировку буфера протокола Google. Это одна из самых маленьких сериализаций, на самом деле она, скорее всего, будет генерировать меньшие пакеты, чем вы будете сериализовать вручную (Как Unity3D по умолчанию обрабатывает сеть, фу).

Что касается скорости, Марк использует очень умный прием (а именно гипердескрипторы) http://www.codeproject.com/Articles/18450/HyperDescriptor-Accelerated-dynamic-property-acces для всего, кроме удаления накладных расходов на отражение во время выполнения.

Пища для размышлений о сетевой абстракции; взгляните на Rx http://msdn.microsoft.com/en-us/data/gg577609.aspx Потоки событий — это самый элегантный способ, который я когда-либо имел дело с сетью и многопоточным взаимодействием внутри подсистемы:

// Sending an object:
m_eventStream.Push(objectInstance);

// 'handling' an object when it arrives:
m_eventStream.Of(typeof(MyClass))
.Subscribe ( obj =>
{
    MyClass thisInstance = (MyClass) obj;
    // Code here will be run when a packet arrives and is deserialized
});
person Alec Thilenius    schedule 19.12.2012
comment
Я видел это, и это действительно превосходно, но как мне выборочно выбирать свойства для сериализации? - person Vaughan Hilts; 20.12.2012

Похоже, вы пытаетесь сериализовать свои объекты для отправки по сети. Я согласен, что неэффективно отправлять полное имя свойства по сети; это потребляет больше байтов, чем вам нужно.

Почему бы не использовать действительно фантастическую библиотеку, которую Google изобрел именно для этой цели.

Это порт .NET: http://code.google.com/p/protobuf-net/

В двух словах, вы определяете сообщения, которые хотите отправить, чтобы каждое свойство имело уникальный идентификатор, чтобы сделать отправку свойств более эффективной:

SomeProperty = 12345

Затем он просто отправляет идентификатор свойства и его значение. Он также оптимизирует способ отправки значений, поэтому может использовать только 1, 2, 3 байта и т. д. в зависимости от размера значения. Очень умно, правда.

person BlokeTech    schedule 10.12.2012
comment
Однако в этом случае мне не придется отправлять КАЖДОЕ свойство? Меня интересует только отправка измененных свойств (не весь объект, я сериализую весь игровой объект, когда создается новый объект, и все) - person Vaughan Hilts; 10.12.2012
comment
Возможно, если вы установите IsRequired в false для каждого свойства, вы можете просто заполнить свойства, которые хотите отправить: code.google.com/p/protobuf-net/wiki/GettingStarted - person Grimace of Despair; 14.12.2012