ECS架构
ECS架构就是实体,组件,系统架构,从守望先锋开始为人所熟知,越来的,人们开始注意到ECS的强大之处,越来越多的游戏使用到了ECS的架构,Unity在2019年版本里正式发布了pakeage来支持ECS架构。
目前包含以下几个包
c# Job System:一个能够安全快速利用多核处理器的 System
Burst:一个新的基于 LLVM 的后端编译器,能够生成高度优化后的机器码
Entites:ECS架构的核心库,使用面向数据的方式能够更容易的提供 Job System 和 Burst 所需要的良好数据结构
Unity Physics:基于 DOTS 构建的新的物理系统当前依旧是很早期状态
Unity NetCode:基于 ECS 构建的带有客户端预测的服务器模型,可以用于创建多人游戏
DSPGraph:新的混音系统,c#编写,使用了 Job System,能够使用 Burst 编译,
Unity Animation:DOTS的动画系统,当前并不能用于商业生成
组件
组件是ECS中最基础的单位,不同于Unity的组件,该组件只存放数据,不处理逻辑,因此可以用结构体来存放数据。结构体相比于类的一个特点是他存放与栈中,而类存放在堆中,这个特点决定了结构体的存取速度更快,并且不需要手动GC。
实体
实体可以看成是组件列表,同样的,实体并不进行任何的逻辑处理,实体可以看成的一个ID,其上所有的组件都共享这个ID,通过这个ID可以标识两个不同的组件。
系统
系统主要负责的是逻辑的处理,对应组件的系统通过获取所有组件,来对每个组件进行操作,同时也可以通过实体来找到特定的组件,组件的存放方式决定了使用系统来批量处理组件的优越性。
总
总的来说,ECS相比与其他的架构的优越性在于并行处理大量数据,这可以提高服务器响应的时间,也可以提高客户端的计算效率,将更多的资源放在计算其他无法并行计算的数据上,但是相应的,如果数据量较小的话,使用ECS架构并不能很好的体现他的优越性,甚至不如其他的架构。
Test
这里使用两个对比的场景来测试ECS的效率,关于如何在Unity中使用DOTS可以阅读:http://www.u3dc.com/archives/3509
以上是没有使用DOTS的情况下,创建了100个Cube并旋转时的帧数,可以看到基本上在700帧左右。(很多重叠在一起,但确实是有100个Cube)
以上使用了DOTS,在另一个场景中创建了100个Cube,并同时进行旋转,可以看到帧数大概在400帧左右。
第二组测试我们创建了3000个Cube,可以看到帧率从之前100个Cube 700帧降低到150帧左右
使用DOTS的情况下,创建3000个Cube,帧率仅仅从100个Cube 400帧降低到350帧左右
从这个对比可以看出DOTS在处理少量数据的情况下并没有优势,其优势在于处理大量的数据。现在的游戏需要处理的数据越来越多,如开放世界里的树木,大量的子弹等,数据的趋同性可以很好的使用DOTS来提高效率。 |