Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中实现对象的增量压缩?_C#_Networking_Multiplayer_Compression_Serialization - Fatal编程技术网

如何在C#中实现对象的增量压缩?

如何在C#中实现对象的增量压缩?,c#,networking,multiplayer,compression,serialization,C#,Networking,Multiplayer,Compression,Serialization,我正在开发一款基于服务器的多人游戏,用C#编写。服务器和客户端共享代码,每个对象都具有相同的int-ID。我希望通过只发送更改后的数据,使网络尽可能轻松 游戏有很多类,这些类有很多字段/属性,并且它们经常发生变化。 我正在寻找一种方法来检测这些值何时更改,并将这些值发送到客户端 基本上,该算法: 更改对象时对其进行标记 在网络标记处更改对象时: 将每个属性与其以前的状态进行比较 仅发送更改的值 存储旧值 在客户端接收它们 实例化相同类型的对象,或按ID查找 设置新值 当然,.NET反射可能能够

我正在开发一款基于服务器的多人游戏,用C#编写。服务器和客户端共享代码,每个对象都具有相同的
int-ID
。我希望通过只发送更改后的数据,使网络尽可能轻松

游戏有很多类,这些类有很多字段/属性,并且它们经常发生变化。 我正在寻找一种方法来检测这些值何时更改,并将这些值发送到客户端

基本上,该算法:

  • 更改对象时对其进行标记
  • 在网络标记处更改对象时:
  • 将每个属性与其以前的状态进行比较
  • 仅发送更改的值
  • 存储旧值
  • 在客户端接收它们
  • 实例化相同类型的对象,或按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没有指出任何时间需求,所以他可能在追逐一个不存在的幻影问题。这就是为什么我们进行测试和分析,而不是从互联网上的人们那里随机得到“速度太慢了”的建议