ECS丨先导篇--概念
提示:选中右侧目录,可快速找到所需内容
本系列博客地址:传送门
为什么要用ECS?
- ECS运行流畅。
在解决大型场景卡顿,有着相当好的效果,比如几百几千个士兵,弓箭发射,粒子特效,比如成千上万条鱼在游。ECS运行方式与传统MonoBehaviour不同的,其特有的运行方式,更高效的运行代码、物体渲染。
什么是ECS?
- 是一种编写高性能代码的方法(框架)
- ECS 只是 DOTS(面向数据技术栈)的一部分。
- ECS虽然不包括 C# Job System、Burst Complier,但这两个也是ECS使用到的。C# Job System使得ECS变成多线程运行,Burst Complier加快了ECS的编译速度。
ECS怎样优化的?
1、ECS本身特点
ECS代码的编写方式,使得读取数据比Mono更快。
2、多线程
传统的MonoBehaviour:
是单线程,每一帧的画面,是Update,一个命令运行完,进行下一个命令,从头跑到尾,进行绘制。
ECS:
C# Job System使ECS变成多线程。能发挥多核CPU优势
比如只开一个闸机,和开了8个闸机口,哪个快。当然8个闸机多线程快,这样懂了吧。
3、Burst Complier
它加快了ECS的编译速度。
现有面向对象编程的瓶颈
什么是面向对象?
我们之前的Mono是面向对象,先得到gameObject,再操作gameObject上的数据,面向的gameObject。
面向数据是什么?
现在直接操作gameObject上的数据,就是面向数据。至于怎么操作,那我们后面会讲。
1、Mono访问数据慢
因为我们现在是用的MonoBehaviour类,类是引用类型,在堆上,比值类型慢。
比如我们想访问某物体的组件,首先要访问gameObject,再得到某组件。而这些组件在内存里不一定放在哪。很乱,所以得在内存里一个一个找它。
2、数据冗余
Mono访问一个属性,会带出其他不必要的属性。
比如我们想访问transform.position,但我们访问了transform,transform里也包含着rotation、up、right、forward等等信息,就导致我们只想访问一个位置,结果带出了一大堆不需要的属性,浪费内存,减慢运行速度。
3、Mono是单线程
单线程比多线程运行慢。单线程发挥不了多核的优点。
比如一个窗口排队购票,和开了多个窗口排队购票
ECS优点
综上,所以ECS与传统写法相比,优点是什么?
- 默认高性能
- 更容易写出高新跟那个代码
- 更容易写出可重用的代码
- 充分利用现代硬件架构
- ECS数据(成为Archetype)魔人会被紧密的排列在内存中
- Burst compiler,免费的心梗提升
概念重申
我们在上面看到了讲着讲着ECS,莫名其妙也看到了DOTS、Job System、Burst Compiler,很多人就很迷惑了,到底想讲啥,有啥关系!(淡定淡定,木的感情)
那让我来说说,到底我们要讲啥:
DOTS包括:ECS、Job System、Burst Compiler
但ECS更出名,所以说ECS,其实就是代指上面的这几个。
DOTS:Data Oriented Technical Stack,面向数据的技术栈。直接操作gameObject上的数据,就是面向数据
再问,什么是ECS
ECS:新的编程模式。由三部分组成。
1、E=Entity(实体)
组件Component的集合,即为实体。以前叫gameObject,现在叫Entity
2、C=Component(组件)
实现特定功能所需的数据结构。
就是你的脚本、Renderer、Rigibody等等组件。
记得,C仅是数据。原先你一个Mono脚本既包含int、bool数据,也包含void等等方法。但现在,C的脚本,仅写数据。
3、S=System(系统)
针对满足特定组件集合的Entity算法。
就是原先写在Mono里面的那些方法。S仅写方法,不写数据。
好,基本你已经明白了,什么是ECS,还有疑惑的下面留言。
下节,我们讲怎样实现ECS。