2010-04-20 30 views
3

我有一個組織遊戲循環的想法。我對性能有些懷疑。可能有更好的做事方式。如果你有一組遊戲組件,他們都被要求在每個遊戲循環迭代中做一些事情。例如:遊戲循環性能和組件方法

GameData data; // shared 
app.registerComponent("AI", ComponentAI(data)); 
app.registerComponent("Logic", ComponentGameLogic(data)); 
app.registerComponent("2d", Component2d(data)); 
app.registerComponent("Menu", ComponentMenu(data))->setActive(false); 
//... 
while (ok) 
{ 
//... 
app.runAllComponents(); 
//... 
} 

優點:

  1. 良好基於組件的應用,沒有依賴關係,良好的模塊化
  2. 我們可以激活/去激活,註冊/註銷部件動態
  3. 一些組件可以是透明地移除或替換,並且系統仍然可以工作,因爲什麼也沒有發生(改變2d到3d)(團隊合作:每個程序員創建他/她自己的組件,並且不需要其他組件編譯代碼)

疑惑:

  1. 在遊戲圈與虛擬調用組件:: run()的
  2. 我想組件:: run()的返回bool值,並檢查該值內環。如果返回false,則必須禁用組件。所以內部循環變得更加昂貴。

那麼,這個解決方案有多好?你在真實項目中使用過它嗎?

回答

5

一些C++程序員對虛擬函數的開銷有太多擔憂。與功能相比,虛擬調用的開銷通常可以忽略不計。布爾檢查也不是很昂貴。

在最簡單的維護代碼中執行任何結果。只有在需要時才進行優化。如果你確實需要優化,那麼消除虛擬呼叫可能不會成爲你需要的優化。

+0

您的優先級是正確的。但實際上,虛擬通話非常緩慢。當我編寫粒子系統時,每個粒子的虛擬調用比每個粒子系統的調用太慢。 – 2010-04-21 11:21:59

+2

對,重要的可能是您的程序每秒需要調用多少個虛函數。 100000?沒問題。但是,1000萬可能是CPU總時間中的一小部分。 另一個問題是每個函數調用完成多少工作。只要大多數虛擬通話都做了不重要的工作,就沒有問題了。 – Qwertie 2010-04-23 19:29:05

4

在大多數「真實」的遊戲中,對組件之間的相互依賴性有相當嚴格的要求,而排序很重要。

這可能會也可能不會影響到你,但是在用戶交互過程之前(或之後),根據你的場景等,物理生效通常很重要。在這種情況下,你可能需要一些額外的處理來進行排序正確。另外,由於您最有可能擁有某種形式的場景圖或空間分區,因此您需要確保您的「組件」可以利用該功能。這可能意味着,根據你目前的描述,你會多次走你的樹。不過,這也可以通過設計決定來解決。話雖如此,一些組件可能只對空間分區的某些部分感興趣,並且再次想要適當地設計。

+0

這不完全是我的問題的答案,但非常有用。謝謝。 – 2010-04-21 11:24:12

+0

@topright:你的問題聽起來更像是「這個設計是可以接受的」......我試圖給你一些要考慮你當前的設計,如上所述。 – 2010-04-21 17:43:45

+0

我投了你的答案。 – 2010-04-23 19:14:14

1

我在模塊化合成音頻文件生成器中使用了類似的方法。

我似乎記得注意到,編程100個不同的模塊後,出現了在性能產生影響的新的編碼模塊時。

總體上,雖然,我覺得這是一個不錯的辦法。

1

也許我是oldschool,但我真的沒有看到通用組件的價值,因爲我沒有看到它們在運行時被換出。

struct GameObject 
{ 
    Ai* ai; 
    Transform* transform; 
    Renderable* renderable; 
    Collision* collision; 
    Health* health; 
}; 

這適用於從玩家到敵人到天空盒和觸發器的所有事情;只需將給定對象中不需要的「組件」留空即可。你想把所有的AI都放到一個列表中?然後在施工時就這樣做。有了多態性,你可以在其中鎖定各種不同的行爲(例如,玩家的「AI」正在翻譯控制器輸入),除此之外,不需要爲所有內容創建通用基類。無論如何,它會做什麼?

您的「更新所有內容」將不得不明確地調出每個列表,但這不會改變您必須執行的輸入量,而只是將其移動。您不需要混淆地設置需要全局操作的集合,而是明確地列舉操作完成時需要操作的集合。

恕我直言,這不是虛擬電話很慢。這是一個遊戲實體的「組件」不是同質的。他們都做很大不同的事情,所以對待他們是不同的。事實上,它們之間沒有重疊,所以我再次問,如果不用任何有意義的方式使用指向該基類的指針而不將其轉換爲其他類型,基類的意義何在?

+0

1.我受到Jeff Plummer「計算機遊戲的靈活和可擴展的體系結構」的啓發。他描述了數據驅動的體系結構,這些體系結構包含不瞭解彼此的組件,並通過數據存儲和消息隊列進行通信。 – 2010-04-23 20:05:01

+0

2.我也相信使用這些組件是一種靈活的方法。它允許你動態地控制遊戲子系統應該工作。您可以在任何抽象級別上使用這些組件。遊戲對象可以是一個組件。粒子系統可以是一個組件。整個渲染系統和AI可以是組件。菜單或遊戲狀態可以。等等 – 2010-04-23 20:08:02

+0

一如既往,我投你的答案。 – 2010-04-23 20:10:24