我在为实体组件系统设计内存管理时遇到了一些问题,并且在设计细节方面遇到了一些问题。这是我正在尝试做的事情(请注意,所有这些类除了Entity
实际上都是虚拟的,因此会有许多不同的具体实现):
该类Program
将有一个Entity
's 的容器。将Program
循环通过Entity
's 并在每个上调用 update 。它也会有一些SubSystem
's,它也会在每个循环中更新。
每个Entity
将包含两种类型的Component
'。由于它们的生命周期与实体直接相关,因此它们都将由unique_ptr
内部拥有。Entity
一种类型 ,UpdateableComponent
将在Entity.update()
调用该方法时更新。第二种类型SubSystemComponent
将从各自的内部更新SubSystem
.
现在这是我的两个问题。首先是一些Component
's 将控制其父母的生命周期Entity
。我目前对此的想法Component
是能够调用一个函数parent.die()
来改变内部的内部标志Entity
。然后在Program
完成循环通过其更新后,它会循环第二次并Entity
删除在上次更新期间标记为删除的每个。我不知道这是否是一种有效或聪明的方法,尽管它应该避免在其仍在更新Entity
时死亡的问题。Component
第二个问题是我不确定如何SubSystemComponent
从内部引用 's SubSystem
。由于它们是由 a unique_ptr
from insideEntity
引用的,因此我不能使用 ashared_ptr
或 a ,并且当拥有一个组件死亡weak_ptr
时,标准指针最终会悬空。Entity
我可以为这些切换到 ashared_ptr
内部Entity
,然后weak_ptr
在SubSystem
's 中使用 a,但是我宁愿不这样做,因为重点是它Entity
完全拥有它Component
的 's。
所以有两件事:
- 我的第一个想法能以有意义的方式得到改进吗?
- 有没有一种简单的方法来实现
weak_ptr
某种功能,或者我unique_ptr
应该切换到并shared_ptr
确保不会创建多个shared_ptr
SubSystemComponent