【Cocos 3.x 避坑】AutoAtlas 触发“双重打包”:碎图与图集共存导致包体翻倍,非跨 Bundle 引用导致的冗余如何根治?

【问题背景】 近期在优化一款小游戏项目的包体体积。项目采用了多 Bundle 分包策略,并大量使用引擎自带的 AutoAtlas (自动图集)进行 DrawCall 优化。但在最终构建产物中,发现分包体积远超预期。

【排查过程】 最初怀疑是常规的“跨 Bundle 交叉引用”导致的资源重复打包。但在理清所有依赖链(确保无交叉引用)后,通过比对构建后的资源 UUID 发现, 问题出在 AutoAtlas 的打包策略上。

【核心结论:Double Retention 机制】 我发现了一个会导致包体直接翻倍的现象: 只要原始碎图被 Prefab 静态引用,合图就会失效并产生双重冗余。

  1. 场景复现 :
    • 在某个资源目录下存放碎图,并配置 auto-atlas.pac 。
    • 在 UI 预制体(Prefab)的 Sprite 组件上,通过编辑器直接拖入该目录下的碎图资源。
  2. 构建结果 :
    • 控制台触发警告: Warn: [Assets] 图集内的图片资源已被其他资源直接使用,被依赖的 texture 及其 image 资源将会被一同打包出来… 。
    • 检查构建产物(构建后的资源目录):同一个资源的 UUID,既被打进了一个大图集 PNG 中,又以原始碎图 PNG 的形式单独存在。
  3. 技术总结 :
    • 这不是依赖链断裂的问题,而是 Cocos 构建管线在处理 AutoAtlas 时,为了兼容静态引用,采用了最保守的“全量导出”策略。这种 Double Retention(双重留存) 导致一份资源占了两份空间。!
  • 官方是否考虑在构建阶段,将这种静态引用自动重定向到合图后的 SpriteFrame 偏移量上,而不是简单地重复打包?
  • 除了手动将资源移出合图目录或设置 Packable=false ,大家在大型项目中有没有更自动化的规避方案?
    image|690x226

共用的资源放到优先级更高的bundle里

你说的交叉引用我已经排查过了。现在的问题其实是 Cocos 的**‘自动图集刺客’**:

我在一个文件夹里开了自动合图,按理说打包后应该只有一张大图;但因为 Prefab 上的 Sprite 组件直接勾选了里面的碎图,结果打包时 Cocos 既打了一张大图,又把那张碎图单独拎出来打了一遍。最后分包里‘碎图+大图’并存,体积直接翻倍!这锅得甩给 AutoAtlas 的打包逻辑,不是单纯的跨分包引用的事儿。

V3.8.8版本使用自动图集,碎图依然存在!!! 是这个问题吗 387版本升级到388版本后,同样配置打包,388大100M!

1赞

(帖子被作者删除,如无标记将在 24 小时后自动删除)

感谢 解开了我的困惑 :+1: