关于 ECS 的思考

主要观点:

  • 作者对 ECS 经验有限,将分享对其的思考,同时指出 ECS 常被视为深复杂类层次结构的通用解决方案,但并非唯一选择,还有其他方式如浅类层次结构、脚本和标签等。
  • ECS 常被认为与高性能相关,但实际并非必然,其实现中数据局部性和缓存一致性的优势在多组件操作时会减弱, archetypes 虽能解决部分问题但也有性能代价和指针失效等问题,且 ECS 鼓励频繁组件组合迭代,还需要大量实体 - 组件映射查找。
  • ECS 能将冷数据与对象关联,利于内存局部性,但与 archetypes 模型冲突,理想情况是不同类型数据分别存储。
  • ECS 在数据驱动设计方面有优势,能在运行时动态组合行为,但也需要大量 boilerplate 组件,且真正的任意组合可能难以实现。
  • ECS 调试较复杂,视觉调试器在处理 ECS 的整数标识符和间接关联数据时存在困难。
  • 总结 ECS 的优缺点,优点包括运行时动态组合、提供冷数据框架、强制以数据为导向的思维模型;缺点包括增加复杂性、大量实体 - 组件映射查找、调试困难;中性方面包括性能和代码结构取决于实现和考虑的替代方案。
  • 提出更简单的数据导向方式来实现 ECS 的部分功能,如静态创建实体类型并创建系统式更新函数,虽需显式函数调用但代码易读易理解,可控制更新流程,也可添加类似 ECS 的冷数据系统但实体类型在编译时锁定。

关键信息:

  • ECS 模型中实体是唯一标识符,组件可附加于实体,系统操作组件类型。
  • 深类层次结构问题及 ECS 作为替代方案的讨论。
  • ECS 性能方面的细节及 archetypes 的特点。
  • 冷数据与 ECS 的关系及理想存储方式。
  • ECS 在数据驱动设计中的优势与限制。
  • ECS 调试的复杂性。
  • 简单实现 ECS 部分功能的方式及优缺点。

重要细节:

  • 作者实施 ECS 原型,主要通过在线阅读和与实际使用者交流获取经验。
  • 提到不同游戏类型中对组件组合迭代的需求不同。
  • 举例说明简单实现方式中更新不同实体类型的函数调用。
阅读 4
0 条评论