如何让CocosCreator3.x引擎启动提速60%
背景
一个采用 Cocos Creator 3.4.2
引擎开发的3D游戏,除了主游戏外,还有一个精简版游戏。精简版运行在小游戏平台,功能非常简单,所以要求启动速度一定要快。
首先在Creator项目设置
中仅留下 WebGL 1.0
、基础3D功能
、基础2D功能
、用户界面
、运行状态统计
这几个模块,其它的全部去掉。此时 Reelase 构建后,引擎自身文件cc.js
是 2M 大小,在iPhone7手机上,引擎启动耗时是 0.5秒,这对于一个超轻量的小游戏来说,还是不够轻快。因此,对Creator引擎源码进行了全面的裁剪和优化,改造后的引擎包体大小是 1.1M,启动耗时为 0.2秒,基本达到了预期。
这里说的
引擎启动耗时
,是从小游戏入口 game.js 的第一行代码开始,到调用application.js
中的cc.director.loadScene(launchScene, ...)
为止。因为此时引擎已准备就绪,开始加载首场景了,而加载场景的耗时主要看资源量,如果场景复杂则耗时久,和引擎自身没多大关系。所以本文把loadScene(launchScene)
定义为引擎启动结束。
要对Creator引擎裁剪优化,首先是自定义引擎。
一 自定义引擎
以 Mac 平台为例,从Creator右上角点击“编辑器”,即可进入引擎目录,进入 resources/3d,里面有 engine 和 engine-native 两个目录,因为我们是小游戏项目,则只需修改 engine 即可。把整个 engine 文件夹复制到另一个目录,然后在 Creator偏好设置
-> 引擎管理器
中把 自定义ts引擎路径
指向自己刚才复制的那个目录,把 使用内置ts引擎
的勾取消。另外还可以把文字前面那个黄色齿轮点亮,代表这个设置存储在项目内,而不是全局。
如下图所示。
提示:
• 如果只修改引擎ts代码,无需自己编译,只要重启Creator编辑器,就会自动编译;
现在可以任意修改引擎源码,并在项目中生效了。
二 分析启动耗时
刚才说了,原始版本引擎的启动耗时约 500ms,那这 500ms 的时间都花在什么上面呢?先看看引擎启动过程中做了哪些事情,主要流程列出如下。
在每个关键处打印出时间,发现标黄色的这几处:import('cc.js')、initBuiltinRes、**_initMaterials、loadAssetBundle** 耗时较大,其中加载引擎自身文件cc.js
,耗时就超过 200ms ,看来引擎包体是影响启动速度的第一要事。所以首先要减小引擎包体,把不必要模块都删掉。
三 裁剪引擎源码
3.1 先粗删一遍
做这步之前,需要对自己项目的功能非常熟悉,以及对引擎的基本结构有个大致了解。之后操作就比较简单粗旷了,就是到引擎源码目录,把每个子目录和类大概看一遍,按类名搜索,觉得项目用不上的,就把该类和相关引用删掉。有些是整个文件可删除,有些是删除文件中的一部分,配合代码管理神器git
的助力,删除出现问题也可随时回退。
这样一遍过后,引擎包体从 2M 降到了 1.3M。需要注意的是,每一个源码目录下都有个 index.ts
作为索引,删除一个模块后通常还要在 index.ts
中删除相应引用,否则会报错。
值得一提的是,3.x引擎构建时会同时包含glsl1
和glsl3
两个模块,分别对应WebGL 1.0
和WebGL 2.0
,这两模块每个都有 200K 大小,因为我的项目确定只需要WebGL 1.0
就足够,所以直接把glsl3.ts
及相关引用代码删除,这一个操作就减小了 200K。
其它方面,像动态合图、压缩纹理、延迟渲染、部分灯光、平面阴影、模型合批、graphics、bmfont、letterFont、scroll-view、slider、mouse、keyboard等模块都用不上,所以都是整个相关模块删除。
3.2 根据逻辑细删
粗删一遍后,接下来是根据耗时热点,分析代码逻辑进行细删。观察 initBuiltinRes
和 _initMaterials
耗时较久,调试源码发现,引擎默认创建的有些 texture 和 shaer 是用不上的,例如:billboard、graphics、pariticle-gpu等等,所以继续到 effect.ts
和 glsl1.ts
中删除它们的定义。
需要注意,effect.ts
和 glsl1.ts
分别定义了 effect 数组和 shader 数组,这俩兄弟数组是一一对应的关系,所以删除时要在两个ts文件中同时删。这一个操作又减小了 200K,现在引擎包体大小是 1.1M。
3.3 精简wx适配库
最后把wx adapter中不用的模块也去掉,例如:xmldom、video、audio、EditBox等;
最终裁剪掉的模块和相关代码非常多,不再一一列举,所有的如下图所示。
对本次裁剪优化影响较大的几处已标出绿色显示。
四 优化启动逻辑
现在能删的代码都已经删除了,加载 cc.js 已经很快了,但 loadBundle
中加载 main
和 resources
两个 bundle 仍然耗时较长,原因是加载 JSON 文件 比较慢。
4.1 优化JSON读取速度
因为引擎默认采用了异步方式读取 .json 文件,其实 bundle 相关的 .json 很小,只需 1ms 就能读取完成,但因为用了异步,只能被动等待下一个周期返回,这样就至少需要 10~16ms。因此改成了同步方式,这一改动使整个启动至少加快了 50ms。
修改 platforms/minigame/platforms/wechat/wrapper/fs-utils.js 中的 readJson 代码如下:
readJson (filePath, onComplete) {// 在引擎启动过程中使用同步方式读取JSON,以加快启动速度。启动完成后恢复异步if (!window.stAfterScene) {Promise.resolve().then(function() {var result = fsUtils.readJsonSync(filePath);if (!(result instanceof Error)) {onComplete && onComplete(null, result);}});} else {fsUtils.readFile(filePath, 'utf8', function (err, text) {var out = null;if (!err) {try {out = JSON.parse(text);}catch (e) {console.warn(`Read json failed: path: ${filePath} message: ${e.message}`);err = new Error(e.message);}}onComplete && onComplete(err, out);});}
}
如上所示,考虑到运行中加载的JSON文件不确定,也许会很大,所以仅针对启动过程做了提速,启动完成后恢复默认的异步。
其中 window.stAfterScene
是我自己定义的变量,在 application.js
的 onGameStarted
方法中进行定义,并没有太大作用,只是标记引擎启动是否结束。示例代码如下:
window.stBeforeScene = new Date().getTime();
cc.director.loadScene(launchScene, null, function () {window.stAfterScene = new Date().getTime();....
}
4.2 优化图片读取速度
在引擎读取图片时,会先去检测文件是否存在,然后才是真正读取。因为这两个操作都是异步,所以读取一张图片至少需消耗两个异步时间。
为提升启动速度,我在这里去掉检测操作,改为直接读取,这样读取图片的耗时减少了50%。
修改 platforms/minigame/common/engine/AssetManager.js 中的 doNothing 方法,如下:
function doNothing(content, options, onComplete) {try {onComplete(null, content);} catch (err) {onComplete(new Error(`file ${content} does not exist!`));}// exists(content, (existence) => {// if (existence) {// onComplete(null, content);// } else {// onComplete(new Error(`file ${content} does not exist!`));// }// });
}
五 总结
总结本次优化,是先跟踪启动流程,分析耗时热点,然后做引擎包体裁剪,再针对耗时原因做专门优化。对Cocos Creator 3.4.2引擎裁剪优化的最终成果,是引擎代码量从 2M
减小到 1.1M
,iPhone7真机上,游戏引擎启动耗时从 0.5秒
降到 0.2秒
,其中,加载引擎自身耗时约 0.15秒
。
对小项目来说,对引擎启动速度影响较大的是引擎自身的包体,毕竟Creator3.x是一个3D引擎,功能越强大代码量也越大。但是,游戏启动慢并不等同于引擎启动慢,这需要结合实际项目做具体分析。
其次是异步文件加载,在确信文件资源很小的情况下,改用同步会大大加快启动速度。
以上是对Creator引擎裁剪优化的一些总结,欢迎探讨。
更多文章请访问个人主页:https://www.chuyouxiang.com/
如何让CocosCreator3.x引擎启动提速60%相关推荐
- mysql源码分析——InnoDB引擎启动分析
一.InnoDB启动 在MySql中,InnoDB的启动流程其实是很重要的.一些更细节的问题,就藏在了这其中.在前面分析过整个数据库启动的流程,本篇就具体分析一下InnoDB引擎启动所做的各种动作.在 ...
- UE4 源码阅读:从引擎启动到Receive Begin Play
一.引擎主循环 UE版本:4.27 一.引擎主循环的位置: Launch.cpp : Guarded Main函数 二..Guarded Main函数执行逻辑: 1.EnginePreInit:加载大 ...
- 优化总结:有哪些APP启动提速方法?
简介:APP 启动速度的重要性不言而喻.高德地图是一个有着上亿用户的超级 APP,本文从唤端技术.H5 启动页.下载速度.APP加载.线程调度和任务编排等方面,详解相关技术原理和实现方案,分享高德在启 ...
- 以高德为例,超级APP启动提速的实践和思考
前言 启动是门面,好的印象也助于留存率提高.苹果也在系统启动上不断努力,提升用户体验,最新的 M1 宣传中还特别强调了翻盖秒开 macOS,可以看出其对极致启动速度的追求.这篇文章(https://f ...
- 2d游戏引擎_游戏60秒:RTS游戏从2D到3D的蜕变
游戏60秒,小白到老斯基都得懂的基本操作 即时战略游戏(Real-Time Strategy Game),简称RTS.是策略游戏(Strategy Game)的一种.游戏是即时进行的,而不是策略游戏多 ...
- Heroku + node.js错误(Web进程在启动后60秒内未能绑定到$ PORT)
本文翻译自:Heroku + node.js error (Web process failed to bind to $PORT within 60 seconds of launch) I hav ...
- 新手推荐!天池数据挖掘挑战赛,2019全球数据智能大赛正式启动!60万奖金等你来拿...
全球数据智能大赛(2019)由广西壮族自治区人民政府主办,面向全球人工智能优秀团队征集多领域的算法智力成果和解决方案,集结众智,探索数字广西的蓝图,共领数据智能未来发展.其中"科技扶农&qu ...
- 大数据引擎启动时常见错误汇总
1.端口号被占用(java.net.BindException) 不论是Flink,还是Kafka,Zk,hadoop之类的,正常启动,jps进程却未显示错误,先查看启动日志.例如: 端口号被占用的错 ...
- 内核提速开机linux,Linux操作系统开机启动提速方法介绍。
Linux系统是十分优秀的操作系统,但启动时间长是该系统的缺点之一.那么能否通过一些设置来缩短Linux系统的启动时间呢?当然可以.本文将向读者展示如何在不牺牲Linux系统可用性的前提下,缩短系统的 ...
最新文章
- Linux 查看文件大小
- Ubuntu18.04.4 报错Name or service not known
- [原] XAF How to Edit multiple objects in a ListViewAndDetailView
- 如何浏览文本字段(下一个/完成按钮)
- dnscapy使用——本质上是建立ssh的代理(通过dns tunnel)
- 【Android测试】【第十四节】Appium——简述
- Ubuntu 16.04下的LAMP环境配置
- 《剑指offer》用两个栈实现队列
- memwatch内存泄露检测工具
- 《Python Cookbook 3rd》笔记(2.9):将Unicode文本标准化
- 面试官系统精讲Java源码及大厂真题 - 21 DelayQueue 源码解析
- MAGENTO与性能优化
- .NET Framework 版本选择参考
- 苹果又开了一个“坏头”
- 基于simulink的Active anti-islanding-AFD主动反孤岛模型仿真
- bi报表工具应该具备哪些功能
- 逆地址解析-【高德地图】【腾讯地图】
- 给本本K46C升级内存并升级64位WIN7
- Vscode 快速打开setting.json
- jQuery UI 插件