Xna 游戏对象中的数据存储

Xna 游戏对象中的数据存储,xna,component-based,Xna,Component Based,我正在用XNA构建一个游戏,目前我的游戏对象组件设置如下: class Character : GameComponent { public int health, state; public float speed; } 等等。 自从创建菜单系统以来,我一直在使用数据容器类型的对象,比如说我有一个DataContainer基类,然后是IntContainer、FloatContainer之类的子类。根据其子类,它们返回包含的数据类型。我想把这个菜单系统连接到组件上,这样我就可以很容易地编辑它

我正在用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());
}
}

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

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

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

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

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

以下是您案例中的一个示例:

public int Health
{
    get
    {
        return (data[0].getValue());
    }
    set
    {
        data[0].setValue(value);
    }
}
这样,在实现逻辑的同时,您可以简单地将字段更改为属性。还要注意,正如我前面所说的,方法是如何导致使用非常非常少的时间的。属性实际上是隐藏的方法,因此调用get或set与调用方法是一样的。这与搜索指定成员的
数据
数组相结合,速度非常快,但不如字段快。因此,尽管如此,您不应该注意到任何延迟,但是如果游戏足够大,它们可能会有一点延迟(虽然现在不应该打扰您,但实际上只适用于您将索引添加到平铺数组或其他内容,只是一个想法)


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

这样做有很多优点和缺点;正如所提出的,你的问题主要基于观点,而且非常广泛。公平,编辑得更加具体。感谢你的输入,任何时候都可能有许多对象处于活动状态,我需要对物理进行每一次优化,所以我不认为我想让数据访问速度更快是在过度优化。由于这引入了一些问题,实际上只解决了一个问题(传递到菜单系统时更干净的代码),因此我认为我将在必要时创建一个方法,将数据序列化并反序列化到容器中。