V7投稿 | 优化 CCClass 实现,让引擎更小一点点,更快一点点

此次投稿拿出了本人去年提交(但是没合并)的一个 PR,没有公开发表过。此 PR 旨在减少引擎和项目加载过程中 CCClass 创建的大量临时对象,但是 CCClass 只占整个引擎性能和包体的一小部分,因此此优化效果未必会很显著。推荐给那些对性能有极致追求的项目,特别是项目中定义了大量 CCClass 的项目。

适配的引擎版本是 3.8.1,理论上 3.x 都能用,不过如果遇到冲突需要自己解决一下。

下面几个中文 PR 包含了详细的中文说明和注释

完整源码及 PR 见:

Highlight

  • 当年适配 ES6 CCClass 时为了兼容 2.x 的 ES5 写法所以底层其实做了一次转换,到了 3.x 这个转换已经没必要了,这次做了整体的移除,可以减少引擎和项目代码在加载过程中创建的很多临时对象。
  • CCClass 那坨 9 年(现在可能是 10 年)没动过的代码干掉后,人类总算能看懂了。

Lowlight

  • 受限于兼容 @property 的诉求,没有办法优化得特别彻底,有机会干掉 property 的话实现会更精简。

此 PR 由原作者(我)亲自负责,通过了所有单元测试,并且经过了时任 Owner shrinktofit 和 PP 的审核,可以放心使用。就当我为引擎做出的最后一次比较大的贡献。经过最近几年的几次比较大的提交,我在引擎这边没有遗留什么大的技术债了。
下面正文,嗯…… 原来就是英文写的,从 3 个原始 PR 里搬运了一部分中文,剩余的英文将就看吧,没说不能用英文投稿吧

Changelog

Simplify the implementation of CCClass (aka. our Reflection System)


三个 PR 合并后,编辑器下引擎主包启动总耗时,优化前 724 ms,优化后 709 ms,优化后 CCClass 耗时占用显著降低。(CCClass overhead reduced by ~25%). 移动端真机待测试,预计能体现个 20 ~ 50ms

优化前开销(部分)

image

优化后开销(部分)

image


引擎 web release 包体,优化都集中在核心包上,核心包减小 3.4KB
引擎在编辑器下的包体减小 10.5 KB

总之,不论从性能还是包体看,此 PR 都偏正向

TODO: There are currently about 4500 decorators used in the engine. In order to be compatible with @property usage, it was not possible to optimize very much. If all decorators were defined in the new discrete way, it is expected that they could be optimized significantly. (In V4.0 ?)


Compatibility Check

This pull request:

  • [ ] changes public API, and have ensured backward compatibility with deprecated features.
  • [ ] affects platform compatibility, e.g. system version, browser version, platform sdk version, platform toolchain, language version, hardware compatibility etc.
  • [ ] affects file structure of the build package or build configuration which requires user project upgrade.
  • [ ] introduces breaking changes, please list all changes, affected features and the scope of violation.
9赞

最后为什么又要废弃呢?

Mark…

离职前清理所有未合并的 PR 看到的,私有仓库的 PR 不清理的话离职后就会丢失,所以要嘛赶紧合要嘛就别合。其实引擎这边是开源的不用清理,后来才想起来。

2赞

还有什么其他好使的 PR,都放马过来。 :heart_eyes:

我之前以为jare仅仅只是一个产品经理而已…,没想到还会写代码,拙见了

1赞

号称写下Creator(的前身)第一行代码的男人

1赞

还得是你啊 牛啊牛啊 :+1: :+1: :+1: :ox: :ox:

一开始就是写代码的,后面去做产品经理了

你咋51还在卷 :laughing:

其实我不想对 cocos 恋恋不舍,但什么让 jare 辗转反侧

1赞

不觉我说着说着他离职了,我的项目遇到一种阻塞

舍不得引擎吧,休息日还发

欢迎失踪人口回归,手动置顶

有什么好东西都发出来吧,mark一下

我是真的为你哭了,你是真的被他撅了

1赞

哈哈哈哈哈

因为平时要上班………………

1赞