c# - 识别占用空间小的属性名称

标签 c# networking overhead

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

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

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

想法?

最佳答案

扩展查理的解释,

Marc Gravell 制作的 protobuf-net 库正是您在序列化方面所需要的。澄清一下,这是 Marc Gravell 的图书馆,而不是 Google 的图书馆。它使用谷歌的 Protocol Buffer 编码。它是现有最小占用空间的序列化之一,事实上,它可能会生成比您手动序列化它更小的数据包(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
});

关于c# - 识别占用空间小的属性名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13796740/

相关文章:

javascript - 在整个地方重复 $() 还是声明一次并重复使用?

c# - 委托(delegate)和事件之间有什么区别?

c# - 使用 Linq 搜索数据库

c# - WPF/C# 取消 DoWork 外部的 BackgroundWorker 调用

c - C语言中的TCP校验和

matlab - 访问稀疏矩阵中的元素是否有开销

c# - 如何在 PDFSharp 中使用私有(private)字体

networking - 无法绑定(bind)到 IPv6 地址

ruby - Ruby 中的轮询()?

C++ static_cast 运行时开销