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