微信小游戲 4M升8M分包加載


 

一、微信分包加載

微信分包加載教程

 嘛,因為原來的4M太小了,滿足不了小游戲內容的需求,現在提升到了8M。這8M可以分包加載,而不需要一次性加載8M。

 

如果是老版本,則分包加載不起作用,會一次加載8M內容,用戶等待會比較久。

 

 

 

二、Egret的解決方案

如何利用微信小游戲的分包加載機制突破4M代碼包體積限制

 

 

三、官方Demo分析

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了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM