天天看点

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

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

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

在深圳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

中有:

var jsList = _CCSettings.jsList           

复制

这样的代码,jsList里面就包含着插件的脚本文件,我只需要在打包过程中,修改

main.js

文件,将配置表的插件文件从

jsList

中删除,那么配置表就不会被预先加载了,代码类似这样:

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

简单的取了,我写了一个函数,必须通过这个函数去取配置表:

window.requireConfig = function(configName) {	
    if (!window[configName] && cc.sys.isNative && cc.sys.isMobile) {		require("src/assets/Script/Config/" + configName + '.js')
}	return window[configName];
}           

复制

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

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

var mapCfg = requireConfig("MapConfig")console.log(mapCfg.name)           

复制

另一个值得提的地方,是

requireConfig

尽量在函数中调用,不要像

require

那样放在模块头,这样可以尽可能的延迟插件的加载。我统计过,在没有做这个处理之前,手机启动到登陆界面,一共加载了65个配置脚本。做了处理后,只加载了5个。这对于手机的启动速度也是非常有好处的。

经过上面的优化之后,脚本行数降到5万多行,编译时间降为8秒。

project.jsc

经过压缩后变成400多K。在一台千元加的安卓上,从启动到进入LOGO界面,大概只要1.7秒时间:)

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