微信小游戲超4M怎么辦?小游戲包體優(yōu)化方案(建議收藏)
對于小游戲而言,包體的大小牽動著許多方面,如下:
加載速度
資源的大小,影響首屏加載的速度,優(yōu)化包體的同時也是在對首屏加載做優(yōu)化,但并不是包體優(yōu)化就一定能夠優(yōu)化首屏加載速度,需要針對性的對首屏資源進行處理。
其次也影響游戲過程中資源加載的速度,如果采用游戲開始統(tǒng)一加載的方式,也會影響進度條的等待時間。
費用與維護成本
目前小游戲分包大小有以下限制:
整個小游戲的所有分包大小不超過 16 M 單個分包/主包的大小不能超過 4 M
因此
對于簡單的小游戲,首先影響首包的大小限制 當包體超過4M時,小游戲無法上傳(必須依賴 CDN 進行資源包遠程加載才可以完成上傳,但該方式產(chǎn)生了本可以避免的額外資源流量費用,當用戶群體龐大時,是一筆不小的費用)
對于復(fù)雜的游戲,無法避免使用CDN,包體的大小依然影響著費用,(修正,本句無效)微信會在小游戲退出之后自動清理所有臨時文件,所以下次再次運行小游戲時,這些資源又會再度下載,反復(fù)地進行流量費用的消耗。
其次,通過上傳 CDN 的方式,則存在版本管理的流程,每次發(fā)包都更加繁瑣。小程序端還需要自己對緩存資源進行管理。
本文中將會提供相關(guān)工具包下載方式,解放你的雙手。
優(yōu)化方向
資源優(yōu)化
紋理壓縮:使用pngquant、pngyu、tinypng等工具完成。Cocos Store 插件商店有現(xiàn)成的工具直接使用。
音頻資源壓縮:可使用 ffmpeg 等第三方工具進行優(yōu)化。
字體:字體文件一般都比較大,幾M到幾十M都有。字體文件包含的字符幾千上萬個,但往往我只用到其中很小的一部分,這時候就可以使用字體提取工具進行提取,獲得只包含用到的字的字體文件。這個優(yōu)化也是比較明顯的。這里推薦使用 fontmin_tool 工具。
拆分prefab:提高 prefab 復(fù)用率,對于有大量信息的 prefab,可以編寫解析器,運行時簡化結(jié)構(gòu)保存為j結(jié)構(gòu)更簡單的 json 文件,等待玩家用戶運行時解析 json 生成預(yù)制體的方式完成。這是采取時間換空間的方式進行優(yōu)化。
檢查 resource 中資源,動態(tài)加載過程中不需要加載的資源需要移出來,否則無用資源也會被打進包體,導(dǎo)致包體變大。
3D 模型面數(shù)減少。專業(yè)的同學(xué)可以選擇3d max進行操作,也可選擇簡易的 Skinny3D 減面工具(操作相當簡單,論壇提供了下載鏈接),進行快速的減面操作,Cocos Creator 3.0 提供了直接的模型壓縮功能。

減少重復(fù)貼圖及重復(fù)材質(zhì)。對于使用重復(fù)貼圖的模型,可以創(chuàng)建共享材質(zhì),賦予共享的材質(zhì)貼圖,大量減少重復(fù)資源。
減少重復(fù)動作信息。對于相同的骨骼結(jié)構(gòu)且使用相同動畫的模型,可將動畫文件作為獨立文件導(dǎo)出,在Creator編輯器中為模型添加動畫,減少動畫信息的重復(fù)。對于過于復(fù)雜的動畫(K幀過多導(dǎo)致模型大小過大),酌情簡化動畫。
裁剪引擎
去除未使用的引擎模塊,直接在編輯器界面即可設(shè)置。其中 Cocos Creator 2.x 打開路徑為:主菜單->設(shè)置->項目設(shè)置
分離引擎
在微信小游戲平臺,發(fā)布平臺支持分離引擎,在發(fā)布界面勾選允許分離引擎后,如果用戶已經(jīng)運行過同版本 Cocos 引擎發(fā)布的小游戲而產(chǎn)生了緩存,則自動剔除首包大小。
代碼壓縮
論壇上 yans 已分享工具,已放文末工具包:代碼壓縮工具
https://forum.cocos.org/t/topic/90046
ZIP包處理
可將遠程資源打成一個 zip 包,加載資源時下載 zip,然后解壓到本地,再直接讀取本地的資源,這個壓縮率也是比較可觀的。
該實現(xiàn)方案我還未進行實操,后續(xù)將出具體文章詳細介紹這塊的實踐結(jié)果。如果有大佬實踐過,非常期待分享。鏈接分享:
https://blog.csdn.net/erweimac/article/details/83008267 https://forum.cocos.org/t/zip/77500
用 jszip 解壓 zip 文件
https://forum.cocos.org/t/jszip-zip/92462
小結(jié)
進行包體優(yōu)化時,可遵循以下的優(yōu)先級:
盡量通過資源優(yōu)化、裁剪引擎、代碼壓縮、分離引擎等方式將包體壓縮在 4M 之內(nèi); 如果無法壓縮在 4M 之內(nèi),則使用分包; 分包總和還是超過 16M(微信平臺,其他平臺數(shù)值還需查詢),還無法解決,則使用遠程資源加載,可考慮使用zip方式在游戲啟動時進行統(tǒng)一加載。
對于首屏資源,不與其他資源進行合圖等操作,避免下載首屏資源需要下載大圖。其次首屏資源盡量簡單,在首屏中進行進度條加載遠程資源或者子包的方式優(yōu)化用戶體驗。
若文中有紕漏,歡迎大家進行糾正以及補充。
