标识占用空间较低的属性名称



我希望发送数据包以同步游戏中不断变化的游戏对象的属性。我已经将服务器端的属性何时更改的通知发送到负责发送更新供客户端使用的 EntitySync 对象。

现在,我正在前缀属性字符串名称。当您发送大量更新(位置、HP、角度)时,这是很大的开销。我想要一种半独特的方法来识别这些数据包。

我想到了属性(反射...慢?),在末尾使用后缀并将其作为 ID 发送(Position_A,HP_A),但我不知所措,无法以低足迹快速识别这些属性。它应该消耗尽可能少的字节。

想法?

扩展查理的解释,

Marc Gravell 制作的 protobuf-net 库正是您在序列化方面正在寻找的。澄清一下,这是Marc Gravell的图书馆,而不是Google。它使用谷歌的协议缓冲区编码。它是最小的序列化之一,实际上它可能会产生比您手动序列化它更小的数据包(默认 Unity3D 如何处理网络,哎呀)。

至于速度,Marc使用了一些非常聪明的技巧(即超描述符)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
});

听起来您正在尝试序列化对象以通过网络发送。我同意通过网络发送完整的属性名称效率不高;这消耗的字节数比您需要的要多得多。

为什么不使用谷歌为此目的发明的一个非常棒的库。

这是 .NET 端口:http://code.google.com/p/protobuf-net/

简而言之,您可以定义要发送的消息,以便每个属性都有一个唯一的 ID,以使发送属性更高效:

SomeProperty = 12345

然后它只发送属性的 id 及其值。它还优化了发送值的方式,因此它可能只使用 1、2、3 个字节等,具体取决于值的大小。非常聪明,真的。

相关内容

  • 没有找到相关文章

最新更新