此次投稿拿出了本人去年提交(但是没合并)的一个 PR,没有公开发表过。此 PR 旨在减少引擎和项目加载过程中 CCClass 创建的大量临时对象,但是 CCClass 只占整个引擎性能和包体的一小部分,因此此优化效果未必会很显著。推荐给那些对性能有极致追求的项目,特别是项目中定义了大量 CCClass 的项目。
适配的引擎版本是 3.8.1,理论上 3.x 都能用,不过如果遇到冲突需要自己解决一下。
下面几个中文 PR 包含了详细的中文说明和注释
- https://github.com/jareguo/engine/pull/7 (Approved by shrinktofit、PP)
- https://github.com/jareguo/engine/pull/8 (Approved by shrinktofit、PP)
- https://github.com/jareguo/engine/pull/9 (Approved by shrinktofit、PP)
完整源码及 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
优化前开销(部分)
优化后开销(部分)
引擎 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.