我已经写了一个 ECS,但我对更新阶段有一些疑问。(在系统中)我读过很多文章,但没有找到对这类问题的引用。
为了从 ECS 中受益(例如缓存友好),它们是以下要求:
- 实体必须只是一个 ID。
- 组件必须是纯数据(没有逻辑的结构)。
- 系统包含逻辑并更新组件。
- 系统之间没有交互(而是系统通过向实体添加“标签”组件进行通信)。
因此,每个系统中应用的逻辑都很好,并且在它们不是“用户代码”时都可以正常工作。但是,当我们处理用户代码时(例如,用户可以将 C++ 代码附加到对象(如 Unity、Unreal)),问题就来了:
- 由于组件只包含数据,当用户修改本地位置时,世界位置不会更新(世界位置将在Transform System处理每个Transform Component时计算。所以如果用户在修改后询问世界位置它的本地位置,它将获得以前的世界位置,而不是实际位置。
- 当一个实体被移除时,它的孩子必须被移除。由于组件仅包含数据而不包含逻辑,因此不会删除子组件(它将在下一次父系统更新中)。所以我们有一些“延迟”(孩子仍然可以访问,但将在下一次父系统更新时被删除)。
- 假设我们有实体 A、B、C。B 是 A 的子代。在用户代码(实体附加的 c++ 代码)中,用户设置 B 的父代有 C,然后删除实体 A。当父系统将更新,它会检测到 A 已被移除,(它也可以检测到实体 A 的父级已更改)但是系统如何知道实体 A 是否在实体 B 的父级更改之后或之前已被删除?
在组件中添加逻辑将破坏纯 ECS 的优势(以缓存友好的方式对所有相同的组件执行相同的操作),所以恕我直言,这不是一个解决方案。
有人有解决方案吗?我想知道您如何处理 ECS 实施中的此类问题。
谢谢!