2014-04-01 67 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