0

我目前正在使用 XNA 构建游戏,我目前的游戏对象组件设置如下:

class Character : GameComponent
{
public int health, state;
public float speed;
}

等等。自从制作菜单系统以来,我一直在玩数据容器类型的对象,比如我有一个 DataContainer 的基类,然后是 IntContainer、FloatContainer 等子类。根据它们的子类,它们返回它们包含的数据类型。我想将此菜单系统连接到组件,以便我可以轻松编辑它们,我想知道是否应该更改我的组件以也采用这种保存通用数据容器而不是显式类型数据的模型,就像这样:

class Character : GameComponent
{
public DataContainer[] data;

public int health()
{
return (data[0].getValue());
}
}

我可以像上面一样保留适当命名的方法,因此在代码中按名称获取值仍然很简单。将我的引擎换成这种数据存储方法需要一些工作,所以我想知道是否有人输入过,更通用的方法是否会以任何可衡量的方式影响性能?调用两种方法获取值是否比直接获取值更糟糕?

4

1 回答 1

0

调用方法总是比直接获取字段稍慢,但这不会产生明显的影响,除非每帧调用数百次。(例如:您可能不应该getTile(x, y)在您的渲染代码、照明代码中使用任何适用的代码)

我必须说DataContainer对所有属性使用 s 似乎有点不合常规,但是它们对于序列化数据肯定很有用。

如果您想使用它们,而不是使您的代码复杂化并添加获取和设置它们的方法,您可以使用属性。(看看这个教程

属性允许您控制对私有成员的访问、调用函数或计算逻辑,同时仍然看起来像常规变量。

这是您的示例:

public int Health
{
    get
    {
        return (data[0].getValue());
    }
    set
    {
        data[0].setValue(value);
    }
}

这样,您可以简单地将字段更改为属性,同时实现您的逻辑。另请注意,正如我之前所说,方法确实会导致使用非常非常少的时间。属性实际上是底层的方法,因此调用 get 或 set 将与调用方法相同。这与在data数组中搜索指定成员相结合,将非常快,但不如字段快。所以,话虽如此,你不应该注意到任何滞后,但如果游戏足够大,它们可能会是一个轻微的量(虽然它现在不应该打扰你,真的只适用于你要为你的磁贴添加索引数组什么的,只是一个想法)

如果你要问我,我会说保持简单,在程序中使用字段和属性的标准方法,不需要引入自定义 DataContainers,事实上,在我看来你不应该需要。

于 2014-04-01T20:03:20.793 回答