0

我在为实体组件系统设计内存管理时遇到了一些问题,并且在设计细节方面遇到了一些问题。这是我正在尝试做的事情(请注意,所有这些类除了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_ptrSubSystem's 中使用 a,但是我宁愿不这样做,因为重点是它Entity完全拥有它Component的 's。

所以有两件事:

  • 我的第一个想法能以有意义的方式得到改进吗?
  • 有没有一种简单的方法来实现weak_ptr某种功能,或者我unique_ptr应该切换到并shared_ptr确保不会创建多个shared_ptrSubSystemComponent
4

1 回答 1

1

我的第一个想法能以有意义的方式得到改进吗?

如果不了解更多关于正在开展的工作的性质,很难说。例如,您没有提及您对线程的使用,但您的设计似乎通过按设定的顺序循环处理所有可能的更新,从而对所有可能的更新给予同等优先级。对于一些低延迟很重要的事情,或者理想情况下有一些有用的优先级,这样的循环序列并不好,而其他时候它是理想的。

还有其他方法可以协调组件驱动从程序中删除实体:

  • 返回代码可能会冒泡到实体的循环中,从而触发实体容器的擦除,
  • 观察者模式或 lambda/std::function可以允许程序指定清理行为。

有没有一种简单的方法可以使用 unique_ptr 来实现 weak_ptr 类的功能,

不。

或者我应该切换到 shared_ptr 并确保不要为 SubSystemComponent 的创建多个 shared_ptr

听起来很合适。您甚至可以将 a 包装shared_ptr在不可复制的类中以避免意外错误。

或者-至于上面的实体销毁-您可以协调事件之间的链接SubSystemSubSystemComponent使用事件,因此SubSystemComponent析构函数回调SubSystem. 观察者模式是做到这一点的一种方式,一个SubSystemComponent-sidestd::function馈送 lambda 更加灵活。无论哪种方式,都会从其记录Subsystem中删除。SubSystemComponent

于 2013-07-02T05:34:52.593 回答