Entity-Component-System (ECS) 是一种架构模式。这种模式广泛地应用在游戏开发中。ECS 使用组合原则,因此这种模式使程序具有更好的灵活性和扩展性。游戏场景中的所有对象都被视为一个实体 (Entity)。这种模式在默认情况下也具有更高的性能。
Entity-Component-System 有三个部分组成
- Entity (实体)
- Component (组件)
- System (系统)
什么是 Entity
Entity 可以理解为一个对象的标识,它没有任何具体的数据和行为,只是标识一个东西。在实现上,通常可以用一个 Struct
来实现。而组件,为其提供数据。
例如,我们要实现一个太空版本 Minecraft,所有游戏中能看到的,有形的东西,都算作一个实体。一搜飞船,一个角色等等。
什么是 Component
组件是附加到实体的可重用模块,它是实体的单一行为描述。组件提供了实体的表现,行为,和功能。不同组件的组合,可以创造出不同类型的逻辑实体。
什么是 System
一个 System 在运行时会遍历很多组件,以此实现高效的性能。例如渲染,物理,寻路。系统为组件提代了全局的管理和服务。
我们可以使用系统来分离逻辑和数据,系统可以用来处理逻辑组件,充当数据容器。
关于系统的例子
- 处理重力加速度
- 将速度应用到一个向量上
- 根据 AI 的设计,来控制机器人的输入
- 渲染 (位置,Sprite)
- 处理玩家输入
组合
我们可以组合不同的 Component,以及设置 Component 不同的数据值,来配置具体的实体。
ECS 的优势
- 降低代码量以及复杂度
- 对于逻辑扩展拥有很高的灵活性
- 对于 3D 和 VR 需要大量渲染逻辑的项目有性能优势
- 让非技术人员更方便地编写脚本
- 可以分离庞大复杂的类结构
- 代码可重用和可组合性很强
- 更加方便的单元测试
- 可以支撑复杂的 VR 程序
- 运行时组件的替换
- 多进程和多线程友好
- 分离数据和功能
- 更加灵活地定义游戏对象
- 提供了解耦,封装,模块化,可重用性方法,以此构成一个干净的设计。
ECS 的劣势
- 不能像 MVC 那样直观定义逻辑
- 要用好 ECS,需要更多的思考组件的设计
- ECS 需要写大量的小型代码,增加了出错的风险
- 目前的应用没有面向对象广泛
ECS 示例
看下面的图,这是一个兔子的实体,其中有很多组件被附加到了实体上,Placeable
、Huggable
、Consumable
、Hopping
等 …
System 将对组件的数据,进行逻辑处理及修改
例如,我们要实现兔子从树上跳下来。我们可以通过系统改变 Placeable
组件的 y 值,使其随着时间的增加,逐渐减小到 0。
而对于兔子的生命,我们可以通过系统,对 Living
的 age 值进行随时间变化的修改。也就是下面的图
总结
- Entity Component System 是一种架构模式
- Entity 标识场景或模拟空间中的一个具体对象
- Component 是实体的单一行为描述
- System 将迭代许多组件来执行低级功能,如渲染图形、执行物理计算或寻径
- 可以通过对 Entity 附加各种不同的组件,组合成各种各样的对象
- 通过使用ECS模式,您可以创建更简短的代码。
- 它不像 MVC 模式那样直观
- 系统行为ECS模型是指系统从一种状态到另一种状态的变化。
欢迎关注 知乎 或微信公众号 猫语互动,博客文章同步推送
https://www.zhihu.com/people/solleter