单纯的ECS其实对性能提升并不大,那为什么Unity要推ECS,而且1年后铁定抛弃原来的Mono架构?(并不是完全抛弃,UI上任然会使用原来那一套)
因为ECS天生的多线程友好。搭配上Unity的JobSystem,轻松占满100%的Cpu,让cpu全速工作(在多核年代,占满CPU意味着牛逼)。如果到时候你还不会ECS+Job,只能干瞪眼。
好了,接下来要说明的是 ECS 是什么 以及为什么对多线程友好。
E C S 三个字母分别代表的是 Entity Component System
Entity 在ECS中他仅仅只是作为Component的容器
Component 你可以把他理解成一个 Struct
System 他拥有一个或多个Component集合 并且带有一个Update方法 每帧对Component里的数据进行操作
定义System时,需要给他注入一个符合规则的Entity集合。这个说法不准确,但好理解。因为,从直观上来说,System选择了这个世界上所有他想要操控的Entity,但其实真正注入的是Entity里装的Component。
例如这个世界上现在存在一个RotSystem,他需求这个世界上所有带Rotation组件(ECS自带),以及带有RotValue组件(自定义的组件,里面只有一个value值用来表示该实体的角速度常量)的Entity。
RotSystem在开始运行前, 会搜索这个世界上所有同时拥有Rotation和RotValue组件的Entity,并把他们的这两个组件注入到自己,进行操作。当用update进行每帧迭代的时候,就会遍历这个Entity(虚拟的)的集合。
这是ECS做的。
因为缓存命中的关系,性能已经有所改善。
但如果每次Update中 要遍历的次数很多,且每次又要完成相对复杂的计算,例如A* 各种AI等
那cpu还是忙不过来的,这时候Job就上场了。他能将一次update中的遍历进行分包,分成多个Job 交给其他核心去跑,
同时ECS的每一次大循环迭代,都会等待所有System中分配的job全部完成 才会进入下一次迭代,保护了游戏逻辑不受多线程影响。
100%Cpu占有率 全速运行 了解一下
https://github.com/zwlstc109/-ECS-Job