我正在为要设计的游戏在C ++中实现ECS模型。为了处理组件之间的通信,我正在练习一个观察者系统,在该系统中,组件可以订阅(即观察)其他组件。
因为我打算使用对象池,所以我的实体(以及组件)必须占用预定的内存量(即,在构造池之后没有堆内存)。
在观察者模型中实现“主题”类时,主题必须持有对其所有观察者的引用。
鉴于我正在为组件使用对象池,因此必须静态分配它们中的所有数据,并且不要依赖可能对堆进行内存请求调用的容器(例如std :: vector) )。
我当前的设计具有一个std :: array,其中包含指向观察者的指针,但是,我觉得这是一个相当笨拙的设计。首先,我无法更改可以订阅主题的观察者的最大数量(因为我必须在编译时确定数组长度)。其次,笨拙地将观察者从主题中移除是因为我必须将每个元素移回以避免std :: array中出现“间隙”。
但是,我非常感谢通知订阅者时能够通过std :: array快速迭代的功能。同样,由于组件订阅者的性质,我也不必过于频繁地“取消订阅”主题。因此,较早提出的从数组中删除引用的困难有些不切实际。
无论如何,我很好奇是否还有其他STL容器可能更适合我的应用程序。
答案 0 :(得分:1)
您可以将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>>;
请注意,通过将一切放入对象池,您正在编写堆管理器。至少通过这种方式,您可以轻松地将堆实现的性能与平台的性能进行比较。