多包融合工具
背景
当前小游戏链路下,所有平台共用同一套 Unity 构建产物。虽然易于管理,但在某些场景下由于缺乏定制化,无法完全释放某个性能特性或技术方案的满血效率。
比如有些能力依赖较新的抖音客户端及基础库,且不同能力的代码包差异较大,需要根据环境加载不同的包。
因此我们增加了多包融合工具,方便开发者做合包操作。
工具版本要求
TTSDK版本最低为 6.9.5,IDE版本最低为 4.5.7。
如果使用命令行版本分包,tt-wasmsplit-cli 版本最低为 1.0.10。
融合产物结构
以 无SIMD包 minigame、SIMD包minigame-simd为例,融合后结果大致如下:
merged_output/ ├── game.js # 根入口:根据条件选择包 ├── game.json # 根配置:聚合所有分包声明 ├── package-selector.js # 条件判断模块 ├── project.config.json # 项目配置(使用默认包) ├── images/ # 公共资源(从默认包复制) ├── StreamingAssets/ # 公共 StreamingAssets ├── minigame/ # 默认包(标准包) │ ├── wasmcode/ # 原始包 wasm │ │ └── xxx.webgl.wasm.code.unityweb.wasm │ ├── data-package/ # 数据包 │ │ └── xxx.webgl.data.unityweb.bin │ └── runtime/ # 其他运行时必要文件 │ ├── game.js │ ├── webgl.framework.js │ ├── plugin.config.js │ ├── unity-namespace.js │ └── webgl-wasm-split.js └── minigame-simd/ # 条件包(SIMD 包) ├── wasmcode/ # 条件包分包名加后缀 → wasmcode-simd │ └── xxx.webgl.wasm.code.unityweb.wasm ├── data-package/ # → data-package-simd │ └── xxx.webgl.data.unityweb.bin └── runtime/ # 其他运行时必要文件 ├── game.js ├── webgl.framework.js ├── plugin.config.js ├── unity-namespace.js └── webgl-wasm-split.js
注意不要修改文件、文件夹的命名。
game.json的变化
融合工具会重新生成
game.json 中的 subpackages。同样地,不要随意修改game.json中的内容。同样以融合 SIMD 的包为例,原来两个单包里都有
{ "subpackages": [ { "name": "wasmcode", "root": "wasmcode/" }, { "name": "data-package", "root": "data-package/" } ] }
融合后会变成类似:
{ "subpackages": [ { "name": "data-package", "root": "minigame/data-package/" }, { "name": "data-package-simd", "root": "minigame-simd/data-package/" }, { "name": "wasmcode", "root": "minigame/wasmcode/" }, { "name": "wasmcode-simd", "root": "minigame-simd/wasmcode/" } ] }
运行时如何选择包
融合产物顶层的 game.js 会先执行 package-selector.js 的环境检测,再根据条件选择加载哪个包。
这两个文件开发者可以在融合后自行修改。
小结
融合包工具主要是为了给开发者提供在不同环境运行不同配置的包,以达到最佳的定制化效果。下一篇我们会以 SIMD 为例,详细介绍从 打单独的场景包 到 最后的融合包 的操作链路。
