gpt4 book ai didi

c++ - 内存管理设计

转载 作者:行者123 更新时间:2023-11-28 07:32:19 25 4
gpt4 key购买 nike

我在为实体组件系统设计内存管理时遇到了一些问题,并且在设计细节方面遇到了一些问题。这是我正在尝试做的事情(请注意,除了 Entity 之外的所有这些类实际上都是虚拟的,因此会有许多不同的具体实现):

Program 类将有一个Entity 的容器。 Program 将遍历 Entity 并对它们中的每一个调用更新。它还会有一些 SubSystem,它也会在每次循环时更新。

每个Entity 将包含两种类型的Component。所有这些都将由 Entity 内的 unique_ptr 拥有,因为它们的生命周期与实体直接相关。一种类型 UpdateableComponent 将在调用 Entity.update() 方法时更新。第二种 SubSystemComponent 将从它们各自的 SubSystem 中更新。

现在这是我的两个问题。第一个是一些 Component 将控制其父 Entity 的生命周期。我目前的想法是,Component 将能够调用函数 parent.die(),这将更改 Entity 中的内部标志。然后在 Program 完成循环更新后,它会进行第二次循环并删除在上次更新期间标记为删除的每个 Entity。我不知道这是否是一种有效或聪明的方法,尽管它应该避免 Entity 在其 Component 仍在更新时死亡的问题.

第二个问题是我不确定如何从 SubSystem 中引用 SubSystemComponent。因为它们由 Entity 内部的 unique_ptr 引用,所以我不能使用 shared_ptrweak_ptr ,当拥有组件的 Entity 死亡时,标准指针最终会悬空。我可以为这些切换到 Entity 中的 shared_ptr,然后在 SubSystem 中使用 weak_ptr,但是我宁愿不这样做,因为重点是 Entity 完全拥有它的 Component

所以有两件事:

  • 能否以有意义的方式改进我的第一个想法?
  • 有没有一种简单的方法可以使用 unique_ptr 实现 weak_ptr 类功能,或者我应该切换到 shared_ptr 并确保不要为 SubSystemComponent
  • 创建多个 shared_ptr

最佳答案

Can my first idea be improved upon in a meaningful way?

如果不了解正在进行的工作的性质,很难说。例如,您没有说任何关于您使用线程的事情,但您的设计似乎通过按设定顺序循环执行所有可能的更新来赋予同等优先级。对于低延迟很重要的某些事情,或者有一些理想情况下应该完成的有用的优先级排序,这样的循环序列并不好,而其他时候它是理想的。

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

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

Is there an easy way to implement a weak_ptr sort of functionality with unique_ptr,

没有。

or should I just switch to shared_ptr and just make sure to not create more than one shared_ptr to the SubSystemComponent's

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

或者 - 至于上面的实体销毁 - 你可以使用事件协调 SubSystemSubSystemComponent 之间的联系,所以 SubSystemComponent 析构函数回调到 子系统。观察者模式是实现此目的的一种方式,SubSystemComponentstd::function 提供 lambda 甚至更加灵活。无论哪种方式,Subsystem 都会从其记录中删除 SubSystemComponent

关于c++ - 内存管理设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17417123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com