Подтвердить что ты не робот

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

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

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

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

Идеи?

4b9b3361

Ответ 1

Развернувшись на объяснениях Чарли,

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

Что касается скорости, Марк использует очень умный трюк (А именно HyperDescriptors) 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
});

Ответ 2

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

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

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

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

SomeProperty = 12345

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