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更快。

扫描二维码关注公众号,回复: 10820241 查看本文章

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。

发布了335 篇原创文章 · 获赞 88 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/weixin_38239050/article/details/105461071