前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Creator优化心得:减少脚本文件的大小

Creator优化心得:减少脚本文件的大小

作者头像
张晓衡
发布2019-09-11 17:00:09
1.2K0
发布2019-09-11 17:00:09
举报

星期2是公众号更新的一个时间点,Shawn这几天情事太多,眼看就快要过12点了,公众号教程看来今天黄呀!但是不发晚上睡不着呀,看来我是中了得到罗胖的毒“死磕自己”,一定要把公众号给发了。还好之前留着大神Colin的一些文章,还没在公众号上推送过,我立马读了一下,任然有不少收获,现将这篇文章分享给大家,在此感谢Colin!

在深圳Cocos沙龙上,有幸结识了社区中大名顶顶的Colin,Shawn在论坛上第一次看到Colin的团队用CocosCreator制作的《热血暗黑》时就被深深地震撼到了!更为重要的是,Colin将他的技术心得和宝贵开发经验写成文字,每一篇分享都是满满的干活,而且幸运的是Shawn得到Colin的授权许可,将他的文章散播到奎特尔星球,与你一起欣赏一起成长!

Cocos Creator优化心得:减少脚本文件的大小

首先得说明,我们做的是原生版的手游,所以下面的优化只对原生版有用。

众所周知,当前的Creator不管是调试还是打包,都会将脚本先打包成一个大文件。这对于小型一点游戏项目没有太大问题,一旦代码以万行计,问题就各种暴露出来了:

  • 首担其冲是开发时的编译,我们目前的脚本是11万行左右,改一下代码,基本上需要编译20秒以上。
  • 其次是程序在手机中的启动时间,编译成jsc后,大概是5M左右,JS要加载这5M脚本,还是需要一些时间的。
  • 最后是热更新大小,5M的文件压缩之后,差不多是1.7M左右,也即是每次的热更最小需要这么大小。

我原来的想法是将策划的配置表设置为插件的方式,这样大约可以减少一半的代码行,不知道你对这个数据的感觉如何,对于一个长线的MMO来说,5万行配置数据是很正常的。但是看了官方文档,说插件会在脚本启动前一次性加载,而配置文件大概有200多个,这在安卓上可能会很恐怖的。我还真就编译了一个配置数据是插件的安卓包试过,结果启动时间是10秒左右,而且内存暴涨。从这个例子也侧面证明安卓的IO速度真是出了名的慢,因为这个限制,也没去深入研究,只好作罢。

今天经由@panda的提醒,才知道插件是可以不用一次性加载的,在打包出来的main.js中有:

代码语言:javascript
复制
var jsList = _CCSettings.jsList

这样的代码,jsList里面就包含着插件的脚本文件,我只需要在打包过程中,修改main.js文件,将配置表的插件文件从jsList中删除,那么配置表就不会被预先加载了,代码类似这样:

代码语言:javascript
复制
var jsList = _CCSettings.jsListif (jsList) {	
    for (var i = jsList.length-1; i >= 0; --i) {		
        if (isConfigFile(jsList[i])) {		
            // 这是个伪函数,用来判断是不是配置表的
   jsList.splice(i, 1);
}
   }
}

这里先解答点疑问,为什么不将配置文件存为json,在程序中要用再去加载。原因是Creator加载数据都是异步的,这意味着,我每次需要数据的时候,都需要用回调函数的方式,这会很麻烦的。

回到上面,作为插件的配置数据,就不能用require简单的取了,我写了一个函数,必须通过这个函数去取配置表:

代码语言:javascript
复制
window.requireConfig = function(configName) {	
    if (!window[configName] && cc.sys.isNative && cc.sys.isMobile) {		require("src/assets/Script/Config/" + configName + '.js')
}	return window[configName];
}

当插件未加载,并且是手机的原生版,就调用require去加载插件,注意里面的路径。插件加载完后,会保存为全局变量,所以如果全局变量已经存在,就直接返回了。关于插件的一些限制,可以看看官方文档。

从上面可知,其他平台插件是会先加载的,由于我们做的是手游,其他平台只作为开发调试之用,所以就不管了。我索性把上面的脚本也当作一个插件,这样无论在哪里,都可以用下面的代码获取配置数据:

代码语言:javascript
复制
var mapCfg = requireConfig("MapConfig")console.log(mapCfg.name)

另一个值得提的地方,是requireConfig尽量在函数中调用,不要像require那样放在模块头,这样可以尽可能的延迟插件的加载。我统计过,在没有做这个处理之前,手机启动到登陆界面,一共加载了65个配置脚本。做了处理后,只加载了5个。这对于手机的启动速度也是非常有好处的。

经过上面的优化之后,脚本行数降到5万多行,编译时间降为8秒。project.jsc经过压缩后变成400多K。在一台千元加的安卓上,从启动到进入LOGO界面,大概只要1.7秒时间:)

在这里真要感谢panda,和引擎的人做朋友真好,一句话胜读千行代码。另外,新引擎版本的Creator我也试用了,过段时间再发一些体验心得。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Creator星球游戏开发社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档