我在设计实体组件系统的内存管理时遇到了一些问题,并且遇到了一些与设计细节有关的问题。这里就是我试图做(注意,所有这些类除外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