gpt4 book ai didi

game-engine - ECS/CES 共享和依赖组件和缓存位置

转载 作者:行者123 更新时间:2023-12-04 05:48:40 25 4
gpt4 key购买 nike

当存在共享或依赖的组件时,我一直试图围绕 ECS 的工作方式进行思考。我已经阅读了大量关于 ECS 的文章,但似乎无法找到明确的答案。

假设以下场景:

我有一个实体,它有一个 ModelComponent(或 MeshComponent)、一个 PositionComponent 和一个 ParticlesComponent(或 EmitterComponent)。

ModelRenderSystem 需要 ModelComponent 和 PositionComponent。

ParticleRenderSystem 需要 ParticlesComponent 和 PositionComponent。

在 ModelRenderSystem 中,为了缓存效率/局部性,我想遍历所有位于紧凑数组中的 ModelComponents 并渲染它们,但是对于每个模型,我需要提取 PositionComponent。我什至还没有开始考虑如何处理每个模型的纹理、着色器等(这肯定会破坏缓存)。

与 ParticleRenderSystem 类似的问题。我需要 ParticlesComponent 和 PositionComponent,我希望能够以高效/友好的缓存方式运行所有 ParticlesComponent。

我考虑过让 ModelComponent 和 ParticlesComponent 每个都有自己的位置,但是每次模型位置改变时它们都需要同步(想象一下对角色的粒子效果)。这会添加另一个需要跟踪和同步组件或值的实体或组件(并且可能会否定任何缓存效率)。

其他人如何处理这些依赖问题?

最佳答案

降低复杂性的一种方法是反转数据流。

考虑到您的 ModelRenderSystem有一个监听器回调,允许 Entity Framework 通知它一个实体已添加到包含位置和模型组件的模拟中。在此回调期间,系统可以在位置组件或拥有该组件的系统上注册回调,允许 ModelRenderSystem当位置对象改变时被通知。

随着位置变化的变化事件到来,ModelRenderSystem可以将它必须在更新阶段复制的修改列表排入队列,然后在更新期间,它实际上是一个简单的查找每个修改模型并将位置设置为事件中的值。

好处是每帧,您只复制帧期间实际更改的位置更改,并最大限度地减少复制数据所需的查找。虽然位置的更新传播到各种感兴趣的系统可能不是缓存友好的,但您观察到的 yield 会超过这一点。

最后,不要忘记系统不一定需要适本地迭代组件。实体系统中的组件允许您轻松切换可插入行为。系统总是可以管理更缓存友好的数据结构,并使用上述回调方法,允许您以最小的耦合轻松地做到这一点并管理数据复制。

关于game-engine - ECS/CES 共享和依赖组件和缓存位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47277221/

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