ECS是啥?
ECS是一种编程思想,和传统的面向对象有区别
有一篇文章说的挺好,大家可以看看,这里只简要概括一下!
浅谈《守望先锋》中的ECS架构
ECS:
E(Entity)实体
C(Component)组件
S(System)系统
这个是一种编程思想,也算是一种游戏内容的开发框架
游戏里任何对象都可以抽象成 Entity ,我们也可以理解的 Entity=游戏对象
举个例子:一个技能实体算是Entity、一个特效实体、一个玩家实体等等。
游戏对象上的任何一个数据,就是一个Component,可以理解为 Component=对象的具体数据
举个例子:一个玩家的Entity上面有坐标信息,那么就是一个PositionCompoent,还有模型信息,那么就是一个ModelComponent
这个不包含任何方法,只是单纯的存储数据
管理游戏对象上的数据,就是一个System,可以理解为 System=具体逻辑
举个例子:对于玩家实体,我们想修改玩家的坐标,那么就需要一个MoveSystem,操作PositionComponent
用官方的图举个例子
额外特殊说明下,我认为框架有两种:
1.偏工具向的框架:
只是整合了一些工具,比如:资源系统、状态机、UI框架等等。这种框架和游戏内容完全无关
2.偏游戏内容向的框架:
就比如今天说的ECS框架,是会影响到游戏对象怎么更新,数据怎么存储。偏向于游戏的一个具体逻辑
那么ECS有什么好处呢?
从以下关键的几点介绍:
1.逻辑表现分离
因为我们现在要研究帧同步逻辑,帧同步就必须要做到逻辑表现分离
同时也可以针对数据记录关键帧,很容易做到预测以及回滚
2.组合模式优于继承原则
Componet的组合可以提高复用性
对某个功能进行拓展时,几乎不会影响到其它功能模块
3.提升性能
ECS面向数据变成的方式,使得内存排列天然紧密,可以增加CPU的缓存命中率
而且最新的DOTS也可以针对ECS进行性能提升
综上所述,最近就开始研究ECS了,使用的是Unity的Entitas这个插件:传送门
什么要用它呢?
其实ECS只是一种思想,并不依赖于任何插件,你只需要:
1.实现一个 IComponent
接口
2.实现一个 Entity
基类,实现 Get/Add/HasCompoent
等相关方法
3.实现一个 System
基类,获取相关的 Component 进行处理
自己也可以做,但是会有几个不方便的地方:
1.没有现成的可视化窗口(开发耽误时间)
2.没有代码生成器,Compoent里面的变量访问不到等问题
有兴趣的可以自己试试,这里就不多阐述了
那么下一章的内容,就是使用Entitas实现一个简单的逻辑表现分离的Demo!