2014-04-01 65 views
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()); 
} 
} 

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

+0

这样做有很多优点和缺点,正如你所提出的,你的问题很大程度上取决于意见,也非常广泛。 –

+0

公平不够,编辑更具体。 – Elliot

回答

0

调用方法总是比直接获取字段稍慢,但除非每帧调用数百次,否则不会有明显的效果。

我必须说,使用DataContainer献给所有的属性似乎有点非常规:(例如你可能不应该在你的渲染代码,代码照明,适用于任何使用getTile(x, y)),但他们肯定序列化数据有用。

如果你想使用它们,而不是复杂的代码和添加方法来获取和设置它们,你可以使用属性。 (看看this tutorial

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

这是你的情况的一个例子:

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

这种方式可以简单地在改变你的字段属性,同时实现你的逻辑。还请注意,正如我之前所说的,方法确实会导致非常微小的时间使用。属性是真正的方法,所以调用get或set将与调用方法相同。这与搜索指定成员的data数组相结合,将非常快速,但速度不及字段快。所以,有了这个说法,你不应该注意到任何滞后,但是如果游戏足够大,它们可能只是一个小数目(虽然它现在不应该打扰你,但真的只适用于如果你要添加索引到你的瓷砖数组或其他东西,只是一个想法)

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

+0

感谢您的输入,最终可能会有许多对象在任何时候都处于活动状态,并且我需要对物理进行每次优化,所以我不认为我想通过快速访问数据来实现过度优化。由于这引入了一些问题,并且只能解决一个问题(传递到菜单系统时会得到更简洁的代码),所以我想我会制作一种方法,在必要时将数据序列化并将其反序列化为容器。 – Elliot