rpk 包体可通过 zip 解压查看
包体类型 | 包体大小 | 备注 |
---|---|---|
普通包 | 包体<4MB | 打包后 rpk 只有一个包体 |
分包 | 快游戏:主包<4mb + 所有分包<30MB | 打包后 rpk 包含:主包+分包+兼容整包(开平上传时不计算该包体) |
分包加载,即把游戏内容按一定规则拆分为几个包,在首次启动时先下载必要的包,这个必要的包我们称为「主包」,开发者可以在主包内触发其它分包的下载,从而把首次启动的下载耗时分散到游戏运行中。
<分包打包后的RPK包含:兼容整包+主包+分包>
com.application.demo.rpk整体压缩包(包名+.rpk)
------------- com.application.demo.rpk 原整包(包名+.rpk) (兼容老版本引擎的原整包=分包主包+分包A+分包B)
------------- main.rpk 分包主包(main+.rpk) (4M)
------------- pkgA.rpk pkgA分包(子包名+.rpk) (A+B 16M)
------------- pkgB.rpk pkgB分包(子包名+.rpk)
需要先在 manifest.json 中配置分包信息。假设快游戏的 src 目录结构如下
├── game.js
├── manifest.json
├── images
│ ├── a.png
│ ├── b.png
├── package1
│ └── game.js
│ └── images
│ ├── 1.png
│ ├── 2.png
└── package2.js
{
"package": "",
"name": "",
"icon": "/image/logo.png",
"versionName": "",
"versionCode": "",
"minPlatformVersion": "",
"orientation": "", //支持的屏幕方向:portrait 为竖屏,landscape 为横屏
"type": "game",
"allianceVersion": "1300", //默认版本号1300((此字段是联盟包体的关键标识))
"config": {
"logLevel": "debug", //取值为 off,error,warn,info,log,trace,debug"
"debug": false //取值 debug 开关(true,false)
},
"subpackages": [
{
"name": "package1",
"root": "package1/" // mainifest入口:主包和分包都可以是main.js 或 game.js各家作兼容处理, 优先解析main.js
}, {
"name": "package2",
// !!! 注意文件名称只允许出现一个点,不要写成这种 package2.min.js 可能会造成报错
"root": "package2.js" // 也可以指定一个 JS 文件
}
]
}
配置在 subpackages 字段内的目录或 js 文件,将按照配置打包成一个个「分包」,没有配置在 subpackages 中的目录和 js,需要开发者 require,进而打包到「主包」中
为了方便开发,目前 cocos,laya,egret 这三家的 IDE 可以直接导出分包配置,只需要升级到对应版本 cocos>=2.1.3,laya>=2.3.0,Egret Launcher>=1.0.69,Unity 使用最新插件。
我们提供了 qg.loadSubpackage()API 来触发分包的加载,调用 qg.loadSubpackage()在加载完成后,通过 qg.loadSubpackage()的成功回调来通知加载完成。 同时,qg.loadSubpackage()会返回一个 LoadSubpackageTask ,可以通过 LoadSubpackageTask 获取当前下载进度。 示例代码:
const loadTask = qg.loadSubpackage({
name: "package1",
success: function(info) {
// 分包加载成功后通过 success 回调
},
fail: function(info) {
// 分包加载失败通过 fail 回调
},
complete: function() {
// 不关分包加载成功还是失败都会执行此回调
}
});
loadTask.onProgressUpdate(res => {
console.log("下载进度", res.progress);
console.log("已经下载的数据长度", res.totalBytesWritten);
console.log("预期需要下载的数据总长度", res.totalBytesExpectedToWrite);
});