3

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

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

基本上,这个算法:

  1. 更改时标记对象
  2. 使用网络 Tick 上的更改对象:
    1. 将每个属性与其之前的状态进行比较
    2. 仅发送更改的值
    3. 存储旧值
  3. 在客户端接收它们
  4. 实例化同类型的对象,或者通过ID查找
  5. 设置新值

当然,.NET Reflection 或许能够解决这个问题,但是在每个 Tick 中迭代 1000 个对象及其属性将成为性能瓶颈。

我可以发送基本类型(int、float、vector)并保持连接。我的问题是:

发送对象Class并实例化它的最佳方法是什么?

我应该如何检测属性更改以及如何序列化属性,以便在接收时可以在客户端上找到它们的“对”。

4

1 回答 1

3

您可以创建如下内容:

class Mob {
private int _health;
public int Health
{
   get { return _health; }
   set { _health = value; DirtyFlags |= MobDirtyFlags.Health
}
}

这意味着每个属性都有很多代码

或者你可以有一些自定义字典,并且该字典中的每一个变化都会被跟踪,所以

mob.Properties["健康"] = 10; 会跟踪你改变了什么。

这就是 Mooege(暗黑破坏神 3 模拟器)的做法。

第一种方法可以用方面重写(可能是一些自定义代码,这些代码将生成上面在运行时通过 Reflection.Emit 或类似的东西编写的所有代码)。或者,如果您知道所有实体的外观,您可以从一些模板为它们生成类(使用 T4 之类的东西)

至于序列化,这已经足够了: (key: int, value: object) 其中 key 可以是一些枚举,比如 ActorProperties { Health, Strength, ...}

于 2013-08-20T19:58:12.407 回答