识别占用空间较小的属性名称

时间:2012-12-10 07:34:52

标签: c# networking overhead

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

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

我考虑了属性(反射......慢?),在末尾使用后缀并将其作为ID(Position_A,HP_A)发送,但是我不知道如何快速识别这些属性低脚印。它应该消耗尽可能少的字节。

想法?

2 个答案:

答案 0 :(得分:7)

扩大查理的解释,

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

至于速度,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
});

答案 1 :(得分:1)

听起来您正在尝试序列化您的对象以通过网络发送。我同意通过电汇发送完整的财产名称效率不高;这会占用比你需要的更多的字节。

为什么不使用谷歌为此目的发明的非常棒的图书馆。

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

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

SomeProperty = 12345

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