【发布时间】:2018-04-26 21:30:35
【问题描述】:
当存在共享或依赖的组件时,我一直在尝试了解 ECS 的工作原理。我已经阅读了很多关于 ECS 的文章,但似乎无法找到明确的答案。
假设以下场景:
我有一个实体,它有一个 ModelComponent(或 MeshComponent)、一个 PositionComponent 和一个 ParticlesComponent(或 EmitterComponent)。
ModelRenderSystem 需要 ModelComponent 和 PositionComponent。
ParticleRenderSystem 需要 ParticlesComponent 和 PositionComponent。
在 ModelRenderSystem 中,为了缓存效率/局部性,我想遍历紧凑数组中的所有 ModelComponents 并渲染它们,但是对于每个模型,我需要拉出 PositionComponent。我什至还没有开始考虑如何处理每个模型的纹理、着色器等(这肯定会破坏缓存)。
与 ParticleRenderSystem 类似的问题。我需要 ParticlesComponent 和 PositionComponent,并且我希望能够以缓存高效/友好的方式运行所有 ParticlesComponent。
我考虑过让 ModelComponent 和 ParticlesComponent 各有自己的位置,但是每次模型位置发生变化时都需要同步它们(想象一个角色上的粒子效果)。这会添加另一个需要跟踪和同步组件或值的实体或组件(并可能抵消任何缓存效率)。
其他人如何处理这些依赖问题?
【问题讨论】:
-
我已经开始着手实施 ECS,并立即提出了与此相同的问题(有些奇怪的是,(现在)只有一个答案(现在)有 3 个赞成票)。从最初的问题过去了 2 年,您提出了令人满意的解决方案吗?您似乎需要在冗余重复数据(和同步问题)或更差的 CPU 缓存性能之间做出选择。