一、微信分包加載
嘛,因為原來的4M太小了,滿足不了小游戲內容的需求,現在提升到了8M。這8M可以分包加載,而不需要一次性加載8M。
如果是老版本,則分包加載不起作用,會一次加載8M內容,用戶等待會比較久。

二、Egret的解決方案

三、官方Demo分析
根據官網demo,在小游戲主項目和resource同級目錄下新建stage1文件夾,並放了3個js文件,分別是tween.js,main.js和game.js。
game.js是入口文件,在這個入口文件里require了tween.js和main.js。

修改小游戲項目的game.json,增加了subpackages屬性
{
"deviceOrientation": "portrait",
"networkTimeout": {
"request": 5000,
"connectSocket": 5000,
"uploadFile": 5000,
"downloadFile": 5000
},
"subpackages": [
{
"name": "stage1",
"root": "stage1"
}
]
}
在代碼中加載分包stage1。更具體用法查看微信官網教程
const loadTask = wx.loadSubpackage({
name: 'stage1', // name 可以填 name 或者 root
success: function(res) {
// 分包加載成功后通過 success 回調
},
fail: function(res) {
// 分包加載失敗通過 fail 回調
}
})
loadTask.onProgressUpdate(res => {
console.log('下載進度', res.progress)
console.log('已經下載的數據長度', res.totalBytesWritten)
console.log('預期需要下載的數據總長度', res.totalBytesExpectedToWrite)
})
到此,官方Demo的分包加載示例做了幾件事
1. 增加stage1文件夾,並將分包資源放在這個文件夾下
2. 修改game.json,配置分包stage1參數
3. 代碼中使用wx.loadSubpackage加載分包資源
注意:

意思是老版本會整包加載,需要開發者判斷是否支持wx.loadSubpackage屬性判斷是否老版本,如果是老版本然后主動調用require代碼。具體看官方Demo
if(wx.loadSubpackage){
//支持分包,加載分包
}else{
//不支持分包,開發者主動調用
require('stage1/game.js')
}
Egret官方代碼,在主項目入口game.js中啟動runEgret之前,需要主動調用一次require("./stage1/game.js")分包的入口

四、那么在Egret中怎么利用 分包+RES 加載圖片資源呢?
假如我們有兩個場景,一個是預加載場景,一個是游戲界面。
我們先加載小部分資源,進入預加載場景,然后再加載分包資源,分包資源加載完成再進入游戲場景。
加載小游戲主包資源----->預加載場景(含進度條)----->加載分包------>游戲場景
1.將stage放在resource下

2. 資源組為stage1。

配置game.json,root的路徑如下修改

加載完主包資源后,顯示預加載場景。在該場景中先加載分包並顯示加載進度,再加載資源組到緩存,之后就正常使用和web下一樣了。
const loadTask = wx.loadSubpackage({
name: 'stage1', // name 可以填 name 或者 root
success: function(res) {
console.log("加載分包成功");
},
fail: function(res) {
console.log("加載分包失敗");
},
complete:function(res){
console.log("加載分包完成");
RES.loadGroup("stage1");
}
})
loadTask.onProgressUpdate(res => {
console.log('下載進度', res.progress)
console.log('已經下載的數據長度', res.totalBytesWritten)
console.log('預期需要下載的數據總長度', res.totalBytesExpectedToWrite)
})
補充:
這樣有一個問題,每次發布,微信開發者工具都會提示缺少game.js。 (因為過了一段時間更新。我這里分包路徑是resource/assets/game。不是上面教程的stage1)

需要復制一個game.js(內容是空的)到微信開發者工具路徑下,每次發布都需要復制一次,因為每次發布這個文件就沒了。十分麻煩。

另一種方法:
1.Egret中將需要分包資源分成另外一個資源文件
2. 將分包的資源復制到微信小游戲項目中
這樣就可以避免每次發布,resource文件夾刷新,將game.js刷新掉,導致需要每次發布都復制一次。
Egret需要分包的資源是test資源目錄。test的資源文件是game.res.json。

修改wingProperties.json文件,加上test的資源文件路徑
{
"resourcePlugin": {
"configs": [
{
"configPath": "resource/default.res.json",
"relativePath": "resource/"
},
{
"configPath": "test/game.res.json",
"relativePath": "test/"
}
]
},
"theme": "resource/default.thm.json"
}
在Main中加載game.res.json
await RES.loadConfig("resource/default.res.json", "resource/");
await RES.loadConfig("test/game.res.json", "test");
這樣,在編輯時,就有了兩個資源文件

在test下添加資源文件,EgretIDE是沒有提示的。
復制test到微信小游戲項目下

這樣就可以每次發布不去復制game.js了。
