ECS / CES共享和依赖组件以及缓存位置

时间:2017-11-14 03:35:31

标签: game-engine entity-system

当有共享或依赖的组件时,我一直试图了解ECS的工作原理。我读过很多关于ECS的文章,似乎无法找到明确的答案。

假设以下情形:

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

ModelRenderSystem需要ModelComponent和PositionComponent。

ParticleRenderSystem需要ParticlesComponent和PositionComponent。

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

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

我认为让ModelComponent和ParticlesComponent各自拥有自己的位置,但每次模型位置发生变化时都需要进行同步(想象一下角色的粒子效果)。这增加了另一个需要跟踪和同步组件或值的实体或组件(并可能否定任何缓存效率)。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

好处是,每帧,您只复制在帧期间实际发生更改的位置更改,并最小化复制数据所需的查找。虽然位置的更新传播到各种感兴趣的系统可能不像缓存友好,但是你所观察到的收益不会对此产生影响。

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