星期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
中有:
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我也試用了,過段時間再發一些體驗心得。