10

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

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

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

想法?

4

2 回答 2

6

扩展查理的解释,

Marc Gravell 制作的 protobuf-net 库正是您在序列化方面所寻找的。澄清一下,这是 Marc Gravell 的图书馆,而不是 Google。它使用 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
});
于 2012-12-19T05:23:09.210 回答
1

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

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

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

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

SomeProperty = 12345

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

于 2012-12-10T08:20:27.673 回答