Entity-Component-System (ECS) 是一种架构模式。这种模式广泛地应用在游戏开发中。ECS 使用组合原则,因此这种模式使程序具有更好的灵活性和扩展性。游戏场景中的所有对象都被视为一个实体 (Entity)。这种模式在默认情况下也具有更高的性能。

Entity-Component-System 有三个部分组成

  1. Entity (实体)
  2. Component (组件)
  3. System (系统)

什么是 Entity

Entity 可以理解为一个对象的标识,它没有任何具体的数据和行为,只是标识一个东西。在实现上,通常可以用一个 Struct 来实现。而组件,为其提供数据。

例如,我们要实现一个太空版本 Minecraft,所有游戏中能看到的,有形的东西,都算作一个实体。一搜飞船,一个角色等等。

什么是 Component

组件是附加到实体的可重用模块,它是实体的单一行为描述。组件提供了实体的表现,行为,和功能。不同组件的组合,可以创造出不同类型的逻辑实体。

什么是 System

一个 System 在运行时会遍历很多组件,以此实现高效的性能。例如渲染,物理,寻路。系统为组件提代了全局的管理和服务。

我们可以使用系统来分离逻辑和数据,系统可以用来处理逻辑组件,充当数据容器。

关于系统的例子

  • 处理重力加速度
  • 将速度应用到一个向量上
  • 根据 AI 的设计,来控制机器人的输入
  • 渲染 (位置,Sprite)
  • 处理玩家输入

组合

我们可以组合不同的 Component,以及设置 Component 不同的数据值,来配置具体的实体。

ECS 的优势

  • 降低代码量以及复杂度
  • 对于逻辑扩展拥有很高的灵活性
  • 对于 3D 和 VR 需要大量渲染逻辑的项目有性能优势
  • 让非技术人员更方便地编写脚本
  • 可以分离庞大复杂的类结构
  • 代码可重用和可组合性很强
  • 更加方便的单元测试
  • 可以支撑复杂的 VR 程序
  • 运行时组件的替换
  • 多进程和多线程友好
  • 分离数据和功能
  • 更加灵活地定义游戏对象
  • 提供了解耦,封装,模块化,可重用性方法,以此构成一个干净的设计。

ECS 的劣势

  • 不能像 MVC 那样直观定义逻辑
  • 要用好 ECS,需要更多的思考组件的设计
  • ECS 需要写大量的小型代码,增加了出错的风险
  • 目前的应用没有面向对象广泛

ECS 示例

看下面的图,这是一个兔子的实体,其中有很多组件被附加到了实体上,PlaceableHuggableConsumableHopping 等 …

System 将对组件的数据,进行逻辑处理及修改

例如,我们要实现兔子从树上跳下来。我们可以通过系统改变 Placeable 组件的 y 值,使其随着时间的增加,逐渐减小到 0。

而对于兔子的生命,我们可以通过系统,对 Livingage 值进行随时间变化的修改。也就是下面的图

总结

  • Entity Component System 是一种架构模式
  • Entity 标识场景或模拟空间中的一个具体对象
  • Component 是实体的单一行为描述
  • System 将迭代许多组件来执行低级功能,如渲染图形、执行物理计算或寻径
  • 可以通过对 Entity 附加各种不同的组件,组合成各种各样的对象
  • 通过使用ECS模式,您可以创建更简短的代码。
  • 它不像 MVC 模式那样直观
  • 系统行为ECS模型是指系统从一种状态到另一种状态的变化。

欢迎关注 知乎 或微信公众号 萌一小栈,博客文章同步推送

https://www.zhihu.com/people/solleter

微信公众号