本文转自Unity Connect博主 EntherVarope
ECS是什么?可以做什么?为什么ECS成为我的选择?
什么是ECS(实体组件系统)?
其实ECS的概念早就诞生了,但是它是因为守望先锋才逐渐被人所知。(暴雪的守望先锋是基于ECS模式设计的,用于改善在大场景下多角色运算的效率)
ECS是一种软件架构模式,由三个元素组成:实体(Entity),组件(Component)和系统(System)(看起来和MVC很相似)。游戏程序分为这三个主要元素,并且通过定义每个系统的责任和关系来管理游戏。
实体代表游戏世界中的事物。实体本身没有特定功能,它们将会被组件填充来成为一个实体。
组件是附加到事物的数据。重点不是对象,而是数据,没有办法操纵它。比如操作游戏的角色时,位置,速度和体力等每个状态都将成为一个组成部分,并与称为“角色”实体相关联。另外,实体中的字段信息也被表示为组件部分。
系统是游戏世界的法则。给定与实体关联的某些组件作为数据输入源,或者更新某些组件的值(可能与输入的组件相同)。随着整个系统更新每一帧,游戏世界也在不断进行。我认为最容易想象的是物理定律。例如,想象一个刚体实体。它的运动基于利用位置和速度两个分量的系统来更新坐标。
粗略地说,系统负责处理,组件负责数据,而实体是一组组的组件,用于过滤系统正在处理的内容。由于系统和数据是完全分开的,因此它与面向对象不兼容。
Unity也具有类似于ECS的架构(自Unity2018.2起已提供ECS)。实体是已经削减到极限的游戏对象功能,组件是组件的序列化数据部分,其余部分是系统。Unity ECS是对纯ECS的改进。
ECS可以做什么?
UnityECS正在围绕这一设计模式开发新的“面向数据技术堆栈”(DOTS),如果经常关注Unity的发布会,就或多或少对它有所了解。但是事先写在前边,ECS并不能加速任何类型的游戏/程序。
ECS有望加速游戏的类型
- 弹幕游戏
- 有海量单位的大型RTS
- 开放世界/沙盒
- 集群模拟(例如新出的“动物星球”)
此类具有大量“遵循同一运算规则”对象的程序,便可以利用ECS来加速。
为什么ECS成为我的选择