2010-05-22 28 views
1

因爲我正在開發我的第一款遊戲引擎,所以這些日子我都是關於性能的。我不是C++專家,但經過一些研究後,我發現了緩存和內存對齊的重要性。使用數組來獲得最佳內存對齊和緩存使用,是否有必要?

基本上我發現的是,建議有內存以及專門對準如果你需要一起訪問它們,例如在一個循環。現在

,在我的項目,我做我的遊戲對象管理器,我想擁有的GameObjects引用數組。這意味着我會一個接一個地記住我的對象。

static const size_t MaxNumberGameObjects = 20; 
GameObject mGameObjects[MaxNumberGameObjects]; 

但是,正如我將實施一個基於組件的設計,其中游戲對象將組件(網格,剛體,轉型等)的名單,我是否會獲得一些與數組呢?

反正,我看到有些人只使用一個簡單的std ::地圖存儲遊戲對象。那麼你們覺得呢?

我是最好使用純組件模型?

+8

你最好的東西的設計,很容易使用,易於擴展和易於維護。表現是你最後的擔憂。當然,記住好算法並且不要浪費,但是在扭曲它來試圖獲得性能之前,讓你的設計運行起來。另外,如果你想用查找來存儲名稱,而'std :: map'是這個標準的解決方案,'unordered_map'應該更好。 (你不需要排序,但它更適合,不僅如此,我做過的測試表明,儘管插入速度較慢,但​​查找起來速度更快。)Boost擁有它。 – GManNickG 2010-05-22 19:41:24

+1

unordered_map的東西是一件很好的事情要知道,謝謝,我一直使用地圖... – 2010-05-22 20:00:25

回答

3

有很多是關於互聯網上的高速緩存利用資源,但你可能想學習​​獲得高速緩存和內存系統的很好的理解。

快速點,但 - 讓你的目標很好地融入高速緩存行和獨立的「熱」和「冷」數據。

1

如果您是新的內存訪問和高速緩存使用,我第二尼古拉的鏈接,「什麼每個程序員應該知道記憶。」

至於手頭上的問題:

我建議存儲在他們自己的池每種組件類型,其中他們會被存儲在連續的陣列。例如:

ComponentPool<CollisionComponent> mCollisionComponents; 
ComponentPool<MeshComponent> mMeshComponents; 
... 

當您分配一個GameObject(又名從池中拉),分配具體組件對象的需求。

現在,你應該避免與組件這樣做:

void SomeCollisionWork() { 
    for each object { 
     if(object.hasCollisionComponent()) { 
      DoCollisionWork(object.collisionComponent) 
     } 
    } 
} 

相反,你可以接近這樣的:

void SomeCollisionWork() { 
    for each allocated component in mCollisionComponents { 
     DoCollisionWork(component) 
    } 
} 

如果你真的需要原始GameObject(或其他該對象的組件),你可以在每個組件中存儲一些數據(比如說,GameObject的索引)。通過對象的索引,您可以訪問其他組件的其他ComponentPool s。

什麼是這一切的呢?將功能分成特定的塊或「作業」變得相當容易。然後,如果組件不相互依賴,則可以並行處理它們(對「未來」性能很重要)。

更多關於這一點,我建議你看那個失眠者遊戲已經開發出動態系統組件此演示文稿(請務必仔細閱讀揚聲器筆記):https://docs.google.com/present/edit?id=0ATIohmzo6z7TZGhjbmhidnFfMTg1MWNkcTJmcWZ4&hl=en

相關問題