2012-12-10 38 views
11

我希望发送数据包来同步游戏中不断变化的游戏对象的属性。我已经将服务器端属性更改的时间通知发送给负责发送客户端更新消耗的EntitySync对象。识别一个占地面积小的属性名称

现在,我预先修复了属性字符串名称。当你发送大量更新时(位置,HP,角度),这是很大的开销。我想要一个半独特的方式来idneity这些数据包。

我想过属性(反射...慢?),在末尾使用后缀并将它作为ID(Position_A,HP_A)发送,但是我失去了一种干净的方式来快速识别这些属性与低脚印。它应该消耗尽可能少的字节。

想法?

回答

7

扩大对查理的解释,

由马克Gravell作出的protobuf网库正是你在序列化方面寻找。为了澄清,这是Marc Gravell的图书馆,而不是谷歌。它使用Google的协议缓冲区编码。它是最小尺寸的序列化之一,实际上它可能会产生比手动序列化更小的数据包(默认Unity3D如何处理网络,恶作剧)。至于速度,Marc使用一些非常聪明的技巧(也就是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 
}); 
+0

我已经看到了,它确实非常出色 - 但我该如何选择性地选择要序列化的属性? –

1

这听起来像你想要序列化你的对象通过网络发送。我同意通过电汇发送完整的房产名是无效的;这会消耗比您需要的更多的字节。

为什么不使用Google为此发明的真正精彩的图书馆。

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

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

SomeProperty = 12345 

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

+0

不会我已经实际然而,在这种情况下发送的每一份财产?我只对发送已更改的属性感兴趣(不是整个对象;当创建一个新实体时,我序列化整个游戏对象) –

+0

也许如果您将每个属性的IsRequired设置为false,则只需填写您想要发送的属性:http://code.google.com/p/protobuf-net/wiki/GettingStarted –

相关问题