gpt4 book ai didi

c++ - 在 ECS 模型中,最合适的观察者容器是什么?

转载 作者:行者123 更新时间:2023-11-28 04:36:29 24 4
gpt4 key购买 nike

我正在实现 ECS我正在设计的游戏的 C++ 模型。为了处理组件到组件的通信,我正在使用一个观察者系统,其中的组件可以订阅(即观察)其他组件。

因为我计划使用对象池,所以我的实体(以及组件)有必要占用预先确定的内存量(即在构建池后没有堆内存)。

在观察者模型中实现“主题”类时,主题必须持有对其所有观察者的引用。

考虑到我正在为我的组件使用一个对象池,它们中的所有数据都必须静态分配并且不依赖于可能对堆进行内存请求调用的容器(例如 std::vector ).

我目前的设计以 std::array 为特色,其中包含指向观察者的指针,但是,我觉得这是一个相当笨拙的设计。首先,我无法更改可以订阅主题的最大观察者数量(因为我必须在编译时预先确定数组长度)。其次,从主题中移除观察者很笨拙,因为我必须将每个元素移回以避免 std::array 中的“间隙”。

但是,我很欣赏在通知订阅者时通过 std::array 快速迭代的能力。此外,由于组件订阅者的性质,我不必太频繁地“取消订阅”主题。因此,之前提出的从数组中删除引用的困难有点没有实际意义。

无论如何,我很好奇是否还有其他可能更适合我的应用程序的 STL 容器。

最佳答案

您可以将 std::vector 与适当的分配器一起使用。

template<typename T>
struct IzzoAllocator
{
using value_type = T;
T* allocate( std::size_t n ) { /* do whatever */ }
void deallocate( T* p, std::size_t n ) { /* do whatever */ }
}

template<typename T>
using IzzoVector = std::vector<T, IzzoAllocator<T>>;

请注意,通过将一切 放入对象池,您正在编写一个堆管理器。至少通过这种方式,您可以轻松地将堆实现的性能与平台的性能进行比较

关于c++ - 在 ECS 模型中,最合适的观察者容器是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51267843/

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