ECS 有没有用

刚刚看了下置顶贴子 oops-framework 框架集成里 ecs 框架,
请问 ECS 在 cocos creator 项目中有何优势?
使用范围又是什么?
谢谢

巧了,刚刚也看了那个帖子,本菜菜也是第一次了解,复杂实例组合优于继承?解耦和避免重复代码应该有优势,引擎的组件机制可以理解为一种类似ECS的结构?

在性能方面优势可以忽略,在代码方面使用也并不便捷,本质和Unity的ecs还是不太一样的,只是结构类似,总结下来没啥用

底层实现上,Unity ECS 框架使用了一种称为 Burst 的高性能代码生成器,以提高系统的执行效率。同时,它还使用了内存布局优化和并行计算技术,以最大化 CPU 利用率。此外,ECS 框架还支持多线程,可以在多核 CPU 上实现高效的并行计算。

cocos ecs 为涨工资而生

9赞

:sweat_smile:

ECS在我看来更多的意义在于规范,避免协同开发时每个人的开发思路不一致
如果只是一个人开发的话,用ECS就有些墨迹了

(面试的时候也有用 :100:)

unity的ecs配合burst简直不要太强大,为游戏场景里需要成千上万个单位的而生

ECS的重点核心是在于将数据用数组形成组起来,数组有助于高效利用cpu缓存能大副减少cpu cache miss的问题,至于甚麽多线程那些都是虚的,你数据分离得好在h5环境也可以用webworker进行多线程的密集运算。主要是js的编译引擎在数组处理上基本上都是分散, v8引擎的说法是在数组中会尽量把同类数据的分布上尽量密集排布, 也就是说v8上跑ECS应该有略微提升,但不能像unity那様明显。

2赞

感觉一堆人都没说到点子上,可以看我之前发的帖子

https://www.cnblogs.com/muzzik/p/17053894.html

2赞

你这帖子几句话?

一大篇的废话不如意简言赅

1赞

纯正的ecs中,e中只有唯一标识符,emanager来存储e的组件列表等,c只有纯数据,不能有函数等,s处理特定类型c的数据,这样可以最大程度的解耦,用来做联机游戏和预测回滚十分方便

大部分情况下没用,局部可能出奇效。
调式困难,设计出高cache的代码很困难。
如果涉及出高cache的代码很困难,失去性能优势你还会用ecs么?

难道没有想过,用ecs,可以到时候可以直接把数据转成shareArrayBuffer,放到worker或者gpu中吗。。。

是可以,局部出奇效,说了的

可以模仿代码风格,其他没啥用。

没什么优势 远不如unity的dots

ECS就像OOP一样,是一种编程设计的思想,它不用继承,而是用组合来完成各种功能的实现。避免像OOP哪些在复杂的业务逻辑中出现各种多重继承,或重构基类才能实现的一些扩展功能。它让功能的扩展变的更友好,当然带来的代价是,它的逻辑性不像OOP那么直观。个人理解,不喜勿喷。

1赞

ECS 就是个网红框架,和Rust一样,粗看比较好,实际上用起来比较别扭。主要是看用不用的上他的优点。一般项目建议不用,除非做moba或者fps的那种可以考虑。
这里指的的ECS不是Component框架,而是那种实体id化,组件数据化,所有逻辑放系统的框架。和组合不组合关系不大,如果要组合用Component就可以了。主要优点一个是数据集中,提升逻辑效率,另外一个就是网络同步,回滚这类好取数据的snapshot。
如果要体验怎么个别扭,可以试试Rust下面的Benvy引擎,感受一下怎么写逻辑。
另外如果不用ecs但是也想享受一下数据集中的性能优化,可以看看generational arena(rust里面一个术语),就是一个id到对象连续内存的索引表,把类或者组件的内存分布直接改到里面就好了,不用非要ecs。

1赞

ECS的设计初衷就是缓存友好(ts/js就别想啦),还有一个就是解耦(ts可以模仿)。