我creator2.x 项目原来200多个bundle
creator2.x 项目bundle包越多打包越慢
这项目200bundle打包原来需要30多分钟
一怒之下叫ai把编辑器底裤扒干净,把性能问题修修,现在打包速度提高到5分钟
舒服。。。下面图是优化后打包速度

打包最大性能开销是在自动图集功能里(initTexturePacker)
下面是性能优化日记
Cocos Creator 2.4.15 构建性能优化记录
适用范围:针对项目内 bundle 数量多(数百个)导致构建极慢的问题。
一、问题背景
- 项目 bundle 数量多,即使空 bundle 也会拖慢构建。
- 优化前:每个 bundle 构建至少 10+ 秒,CPU 占用低(大量时间耗在等待/串行上)。
二、优化内容(按轮次)
第 1 轮:消除空 bundle 与重复查询的固定开销
| # | 文件 | 修改 |
|---|---|---|
| 1 | editor/core/gulp-build.js |
query-bundles 任务新增 _emptyCheck:一次 queryMetas("db://**/*", null) 统计每个 bundle 根目录有效资源数(排除 folder/javascript/typescript),bundle 条目带 hasAssets;build-assets 循环中跳过 root && !hasAssets && scenes 空 的 bundle(不发 worker、不建 buildResults)。fail-safe:统计失败时所有 bundle 视为有资源,保持原行为 |
| 2 | editor/core/gulp-build.js |
revision-asset-jsList:zip bundle 缺 res.zip(空 bundle)时不再 renameSync 崩溃,改为 warn + 跳过;compress-bundles 始终生成 res.zip(空 bundle 生成空 zip),防止运行时对 isZip bundle 无条件下载 res.zip 导致 404 |
| 3 | editor/page/build/build-worker.js |
db://**/*.pac 全库查询结果缓存到模块级 _pacQueryCache,每次构建 app:init-build-worker 时清空 |
| 4 | editor/page/build/compile-worker.js |
无脚本 bundle 跳过 browserify/uglify:_writeEmptyBundle 用一次空 browserify 运行缓存输出(合法空输出 = prelude + ({},{},[]);)直接写 index.js;写入失败时回退原流程 |
| 5 | editor/share/bundle-utils.js |
queryBundlesWithScenes(preFolders) 支持传入已查文件夹列表,消除 query-bundles 里的重复全库查询(其他调用方无参调用,向后兼容) |
安全性审计结论(第 4 轮复查)
- 修复 1 挂起风险不成立:
queryBundleFolders更早 await 同一 assetdb,assetdb 不可用时构建先挂在那里;回调错误 → fail-safe 兜底。 - 修复 2 关键事实:引擎
getRect()返回cc.rect(this._rect)拷贝(非引用),packer 写 trim 坐标不污染共享的 SpriteFrame 实例;frame.pacInfo反向引用全库无读取点;cc.js.mixin(目标, meta)不改 meta;build worker 窗口每次构建新建 → 缓存生命周期 = 单次构建,不会跨构建陈旧。 - 既有行为澄清:
temp/TexturePacker/build/<pac>/info.json跨 bundle 共享,靠 mtimes 键集(含 frame uuid 列表)判断复用——不同 bundle 过滤后 frame 集不同则键集不同 → 重算,属原版行为。
三、实测效果
| 指标 | 优化前 | 优化后 |
|---|---|---|
| initTexturePacker | 每 bundle ~6s | 仅首个 bundle ~6s,后续 ~0ms |
| queryPac | 每 bundle ~3s | 仅首个 bundle ~3s |
| 同组重复依赖构建 | 每个 bundle 全量闭包 |
|
| 空 bundle | 全量走完资产构建+编译 | 直接跳过(不发 worker、不编译) |
| 产物体积 | 依赖在每个 bundle 复制 |
|
Cocos Creator 2.4.15 构建性能优化补丁 — 安装说明
补丁形式:文件覆盖。基于 Cocos Creator 2.4.15 官方原版修改,其他版本不保证兼容。
安装完成后,构建多 bundle 工程的速度会有明显提升(空 bundle 跳过、图集/pac 查询缓存等),
并新增构建耗时统计([perf]日志)。
一、补丁内容
app补丁.zip (45.1 KB)
_app/ ← 本目录(对应 app/ 根目录)
├── editor/core/gulp-build.js 构建主编排(空bundle跳过、perf统计等)
├── editor/page/build/build-worker.js 资产构建 worker(pac查询缓存)
├── editor/page/build/compile-worker.js 脚本编译 worker(无脚本bundle跳过编译)
├── editor/page/build/texture-packer/index.js 图集查询跨bundle缓存
├── editor/share/bundle-utils.js 消除重复全库查询
├── 补丁安装说明.md ← 本文档
├── 构建性能优化记录.md ← 改动明细与事故记录(建议阅读)
└── 构建与运行时Bundle解析原理.md ← 构建产物与运行时加载原理(供查阅)
三、安装步骤
以下命令均在终端执行,
CC代指 Creator 安装路径,请先替换:CC="/Applications/Cocos/Creator/2.4.15/CocosCreator.app/Contents/Resources"Windows 同理,路径形如
D:\Cocos\Creator\2.4.15\CocosCreator\resources。
需要已安装 Node.js(用于解包 asar)。
0. 关闭 Cocos Creator,并备份
cp "$CC/app.asar" "$CC/app.asar.bak"
1. 解包 app.asar 为 app/ 目录
cd "$CC"
npx @electron/asar extract app.asar app
# 若 npx @electron/asar 不可用,可试旧包名:npx asar extract app.asar app
2. 合并原生模块(关键,勿漏)
app.asar.unpacked/ 里是打包时被排除的原生模块,解包工具不会自动带出,必须并入:
cp -R "$CC/app.asar.unpacked/node_modules/." "$CC/app/node_modules/"
3. 覆盖补丁文件
把本压缩包(app.zip)解压,将得到的 app 目录里的全部内容按相对路径合并进 app/:
unzip app.zip -d /tmp/cc_patch # 解压补丁包
cp -R /tmp/cc_patch/app/. "$CC/app/" # 注意 /. 结尾:合并目录内容
4. 启动 Cocos Creator
app/ 目录优先级高于 app.asar,补丁自动生效。app.asar(和 .bak)留着不碍事,
想保持环境干净也可以改名或移走。
四、验证
- 打开一个含较多 bundle 的工程,点构建。
- 构建日志中应出现
[perf] task [...]/Build Perf Summary字样(优化新增的耗时统计)。 - 构建产物正常:游戏可运行、bundle 齐全(若曾经配置过远程 bundle,建议对比一次产物)。
五、回滚
rm -rf "$CC/app"
mv "$CC/app.asar.bak" "$CC/app.asar" # 若当时改过名
重启 Creator 即恢复原版。
原理(为什么必须先解包 asar)
Electron(Creator 的运行框架)按以下顺序选择应用代码根目录,第一个能成功加载 package.json 的胜出:
Resources/app/(目录) > Resources/app.asar > Resources/default_app.asar
app/ 目录一旦存在,整个应用都从它加载,app.asar 被完全忽略——这是"整根替换",
不是文件级覆盖。所以不能只把补丁文件拷成 app/ 目录(会缺 main.js、node_modules 等,
编辑器无法启动),必须先把 app.asar 完整解包成 app/ 目录,再覆盖补丁文件。
六、常见问题
-
npx命令不存在:先安装 Node.js(https://nodejs.org),或使用任意 asar 解包工具。 -
启动报错缺模块(如 lzma-native):第 2 步没做或没做完,重新合并
app.asar.unpacked。 -
构建行为和预期不符:确认对方 Creator 版本为 2.4.15(
$CC/app/package.json的version字段)。

