如何在C#中实现对象的增量压缩?
我正在开发一款基于服务器的多人游戏,用C#编写。服务器和客户端共享代码,每个对象都具有相同的如何在C#中实现对象的增量压缩?,c#,networking,multiplayer,compression,serialization,C#,Networking,Multiplayer,Compression,Serialization,我正在开发一款基于服务器的多人游戏,用C#编写。服务器和客户端共享代码,每个对象都具有相同的int-ID。我希望通过只发送更改后的数据,使网络尽可能轻松 游戏有很多类,这些类有很多字段/属性,并且它们经常发生变化。 我正在寻找一种方法来检测这些值何时更改,并将这些值发送到客户端 基本上,该算法: 更改对象时对其进行标记 在网络标记处更改对象时: 将每个属性与其以前的状态进行比较 仅发送更改的值 存储旧值 在客户端接收它们 实例化相同类型的对象,或按ID查找 设置新值 当然,.NET反射可能能够
int-ID
。我希望通过只发送更改后的数据,使网络尽可能轻松
游戏有很多类,这些类有很多字段/属性,并且它们经常发生变化。
我正在寻找一种方法来检测这些值何时更改,并将这些值发送到客户端
基本上,该算法:
当然,.NET反射可能能够解决这个问题,但在每个刻度中迭代1000个对象及其属性将是性能的瓶颈 我可以发送基本类型(int、float、vector)并保持连接。我的问题是: 发送对象的
类并实例化它的最佳方法是什么
如何检测属性更改以及如何序列化属性,以便在接收时在客户端上找到它们的“对”。您可以创建如下内容:
class Mob {
private int _health;
public int Health
{
get { return _health; }
set { _health = value; DirtyFlags |= MobDirtyFlags.Health
}
}
这意味着每个属性都有很多代码
或者你可以有一些自定义词典,词典中的每一个变化都会被跟踪,所以
移动属性[“健康”]=10;会追踪到你改变了什么
这就是Mooege(暗黑破坏神3模拟器)如何做到这一点的
第一种方法可以用方面重写(可能是一些自定义代码,这些代码将通过Reflection.Emit或类似的方式在运行时生成上面编写的所有代码)。
或者,如果您知道所有实体的外观,您可以从一些模板为它们生成类(使用类似T4的内容)
至于序列化,这已经足够好了:
(键:int,值:object)
其中的关键是一些类似枚举的ActorProperties{Health,Strength,…}“当然,.NET反射可能能够解决这个问题,但在每个刻度中迭代1000个对象及其属性将是性能的瓶颈。”您已经分析了这一点,而不仅仅是假设,是吗?这可能不是最有效的方法,但如果它足够有效满足您的需要,就不要使事情复杂化。很明显,即使没有任何评测,这也不起作用。如果有人提出一些更疯狂的建议,比如使用ORM和数据库来查找变更,你仍然会建议先进行分析吗?@Kikaimaru:是的,事实上,我会的,因为你认为“显而易见”的东西远远不是这样。有使用OP方法发布的在线游戏,也有使用数据库和ORM进行变化检测的在线游戏。是什么让你觉得他们天生就太慢了,无法满足OP已经完成的未陈述的需求?@SeanMiddleditch:你能给这些游戏的来源提供一个链接吗?@Kikaimara:这通常是不合法的,所以没有:)我是说像Quake这样的抽搐射击者吗?当然不是。并非所有游戏都需要以30-60hz的频率进行更新。OP没有指出任何时间需求,所以他可能在追逐一个不存在的幻影问题。这就是为什么我们进行测试和分析,而不是从互联网上的人们那里随机得到“速度太慢了”的建议