什么情况下, main包会把所有图片都打包了??

引擎版本: 3.8.3

出现情况

打包之后, main目录把所有的图片资源都占了一份

项目结构

assets
|- abs // 普通目录, 里面全是ab包
   |- doll // ab包目录, 里面全是prefab, 资源来自`res/image/UI/玩偶/xxx`
      |- 1.prefab
      |- 2.prefab
      |- ...
   |- ui // ab包目录, 里面全是prefab, 资源来自`res/image/UI/xxx(不含玩偶和_main)`
      |- xxxUI.prefab
      |- yyyUI.prefab
      |- ...
|- res // 普通目录, 里面不含任何ab包, 理论上只会被引用的图片会被打包
   |- image // 普通目录, 图片资源
      |- icon // 普通目录, 别的分类
      |- UI // 普通目录, UI分类, 基本上和美术输出目录一致
         |- _main // 普通目录, 仅包含首场景资源
               |- autoAtlas.pac // 自动合图: 目录范围为`res/image/UI/_main`
            |- bg.png
            |- btn_login.png
            |- loadingbar.png
            |- ... // 其他图片
         |- 每日奖励
            |- btn_reward.png
            |- ... // 其他图片
         |- 首页
            |- bg_home.png
            |- btn_startGame.png
            |- ... // 其他图片
         |- 玩偶 // 普通目录, 每个子目录都带一个`autoAtlas`
            |- 1
               |- autoAtlas.pac // 自动合图: 目录范围为`res/image/UI/玩偶/1`
               |- bg.png
               |- doll1.png
               |- doll2.png
               |- ... // 其他图片
            |- 2
               |- ... // 结构和玩偶1相似
            |- 3
               |- ... // 结构和玩偶1相似
            |- ... // 若干个玩偶目录
      |- autoAtlas.pac // 自动合图: 目录范围为`res/image`, 意为将剩余的图片合成图集
|- scene // 普通目录
   |- main.scene // 唯一一个场景, 资源严格控制在`res/image/UI/_main`
|- script// 普通目录
   |- ...

计划输出

这个结构, 本意就是让所有ui图打包在一个图集里面, 然后人工划分几个内部图集, 并且控制prefab的资源索引范围
输出应该如下, 根据若干个项目的经验, 也的确如此, 效果可控有效
(以微信小游戏为示例):

assets
   |- doll
      |- import
      |- native // 有若干张合图, 来自`res/image/UI/玩偶/{X}/autoAtlas.pac`
         |- xx/xxxxx.png
         |- xx/xxxxx.png
         |- xx/xxxxx.png
   |- main
      |- import
      |- native
         |- xx/xxxxx.png // 只有1张小合图, 来自`res/image/UI/_main/autoAtlas.pac`
   |- ui
      |- import
      |- native
         |- xx/xxxxx.png // 只有1张大合图, 来自`res/image/autoAtlas.pac`

实际输出

其中某个项目, 因为要做出海, 所以拷贝了一份, 从3.8.4转到3.8.3, 也加了多语言等修改, 主要输出其实是安卓和ios, 但是这个项目出现了莫名的问题, 就算打包web和微信小游戏也依旧有这个情况

assets
   |- doll // 和计划输出无异
      |- import
      |- native
         |- xx/xxxxx.png
         |- xx/xxxxx.png
         |- xx/xxxxx.png
   |- main // [!!] 这里出问题了
      |- import
      |- native
         |- xx/xxxxx.png // 这里把整个项目的图片, 都打包成合图了
         |- xx/xxxxx.png // 变成了非常多张图片
         |- xx/xxxxx.png // 而且合图也没有按照autoAtlas的范围
         |- xx/xxxxx.png // 比如doll的散图和UI的散图, 都混合在一起
   |- ui // 和计划输出无异
      |- import
      |- native
         |- xx/xxxxx.png

排查

排查了很久, 资源引用也没有出错

实在不行, 我尝试把main里面多余的图集, 改成纯白色的图, 以减少包体体积
结果却惊现, 游戏里大部分的ui都变成白色方块了

可见main里面的图, 才是游戏里的真实引用
原来ab包的图, 应该是因为优先级一样, 才拷贝了一份

目前没有排查到任何原因, 只好到论坛问问
不知道有没有类似经验的小伙伴能交流一下

把这个去掉,实际应用中作用不大

最后做了2个demo测试, 仅包含关键结构和几张图片

打包之后发现:

  • 383天然就是对autoAtlas嵌套的情况做增量构建
  • 而384就是会排除内部的autoAtlas

看引擎的版本发布文档也没有提过这件事 :upside_down_face:

虽然我也想要你预期的那种打包方式,然而实际的情况是所有图集最后都在res里(res优先级高于其他),最神奇的是我没觉得它是bug,仅仅是没有我期望的功能而已 :joy:

构建后不存在res, res是一个普通目录(不是resources, 也不是bundle), 它只是一个规范, 约束了美术资源全部放在里面而已, 打包时还是看引用的起点

我知道你说的意思,我是说我现在的用法是把res搞成一个bundle。

那没必要, 我这样设计就是为了让冗余的资源可以自行脱离构建系统