在 ECS 中存储组件的一种缓存有效的方法是将组件类型划分为大型数组,然后让每个系统对组件进行迭代。但是,假设我还想避免渲染和物理线程之间的错误共享,试图同时访问实体的坐标。
让我们假设一个高速缓存行是 64 字节大。假设我有一个 1 GiB 的“位置”数组。我可以将它分成 64 字节的页面,我只需要一个布尔值来存储页面是否繁忙(正在写入)。使用std::vector<bool>
, 每个布尔值仅使用 1 位,这将占用 2 Mib 的内存。
到目前为止,这听起来是可行的。但是,我仍然没有办法有效地处理工作线程发现页面繁忙的情况。
我应该忙着等吗?有没有解决这个问题的通用模式?
或者更重要的是,这是无痛的过度工程吗?我只是想让我的“家庭作业”框架扩展证明,以供学习。从来没有做过大型引擎,我不知道在这种情况下,虚假共享是否真的是一个值得注意的性能上限。