我在設計實體組件系統的內存管理時遇到了一些問題,並且遇到了一些與設計細節有關的問題。這裏就是我試圖做(注意,所有這些類除外Entity
實際上是虛擬的,所以會有很多不同的具體實現):內存管理設計
的Program
類將有Entity
的容器。 Program
將通過Entity
循環並調用它們中的每一個更新。它也會有幾個SubSystem
,它也會在每個循環中更新。
每個Entity
將包含兩種類型的Component
's。他們全部由內部的unique_ptr
擁有,因爲他們的生命週期與實體直接相關。一種類型UpdateableComponent
將在調用Entity.update()
方法時更新。第二種SubSystemComponent
將從其各自的SubSystem
內更新。
現在,這是我的兩個問題。首先是一些Component
將控制其父母Entity
的生命週期。我目前的想法是Component
將能夠調用一個函數parent.die()
這將改變Entity
內的內部標誌。然後,在Program
完成循環更新後,它將循環第二次,並刪除在上次更新期間標記爲刪除的每個Entity
。我不知道這是否是一種有效或者聰明的方式,儘管它應該避免Entity
死亡的問題,而其Component
仍在更新。
第二個問題是我不知道如何從SubSystem
內引用SubSystemComponent
's。由於它們是從Entity
內部引用unique_ptr
,所以我不能使用shared_ptr
或weak_ptr
,並且當擁有組件的Entity
死亡時,標準指針會結束晃動。我可以在Entity
內切換爲shared_ptr
,然後在SubSystem
中使用weak_ptr
,但我寧願不這樣做,因爲整個問題是Entity
完全擁有它的Component
's。
所以兩件事:
- 可以將我的第一個想法可以以有意義的方式在改善?
- 是否有實施
weak_ptr
排序的功能與unique_ptr
一個簡單的方法,或者我應該切換到shared_ptr
,只是確保不創建多個shared_ptr
到SubSystemComponent
的
我想你可能想對內存管理做更多的研究,除非你在這個設計上死心塌地;循環遍歷整個分配的內存空間多次將不可擴展。智能指針始終是最初開始的一種很好且簡單的方法。此外,已經有一些建立完善的C++庫[垃圾收集](http://stackoverflow.com/questions/81062/garbage-collection-libraries-in-c)。 – Suedocode
@Aggieboy我已經考慮過擴展問題,並且已經制定出只將部分數據加載到「實體」中,一次將我限制爲幾千個(可能最多10-20個)。如果我簡單地調用一個bool getter,並且可以從容器中刪除'Entity',那麼第二個循環真的會效率低下嗎?這種設計更重要的是提高代碼的可重用性而不是性能,並且我可以在以後輕鬆優化瓶頸。 –
在嘗試更新組件之前,您可以簡單地檢查'hasToDie'標誌,這不是問題。然而,'unique_ptr'明確地被設計爲單一,嚴格的所有權。正如你已經指出的那樣,只要多於一個的對象需要一個引用(它保證總是有效的或者至少可檢查的),你就不會越過'shared_ptr'和可能的'weak_ptr'。 – arne