我在为实体组件系统设计内存管理时遇到了一些问题,并且在设计细节方面遇到了一些问题。这是我正在尝试做的事情(请注意,所有这些类除了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_ptrfrom 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_ptrSubSystemComponent