自动图集功能有毒 请引擎组给个说法 如果你的项目有大量请求可能是自动合图坑来的

  • Creator 版本:2.3.3

  • 目标平台:Web

  • 主要问题: 当使用自动合图后,引用到脚本里并且使用getSpriteFrame 取出一个spriteFrame时,会产生大量请求,比如合图里有100张碎图,产生了100次请求,已经把合图放到静态引用,json 全都选择了合拼仍有问题。

  • 重现方式:直接使用demo

AutoAltas.zip (1.7 MB)

3.4 也是.

好坑啊, prefab 里引用 atlas.plist, 结果 load prefab 的时候, 产生一百多个请求.

自动图集更坑, 引用了还不能自动加载, getSpriteFrame 返回 null

自动图集的本意是开发阶段用散图,构建时引擎帮你自动合图。如果删掉所有PAC文件之后,项目跑不起来, 那一般是使用姿势不大对。

需要动态加载的,还是用TP打图集吧

是不是编辑器上没把自动图集挂载在节点上?

@ccclass('App')
export class App extends Component
{
    start()
    {
        // 1) TexturePacker plist
        // 使用 OK - ⚠️ 但请注意浏览器, 加载了每一个精灵帧信息.json,产生无数个请求
        resources.load('test', SpriteAtlas, (e,res)=>
        {
            console.log("TP loaded");
            console.log(res.getSpriteFrame('asdf')); // OK
        });

        // 2) 自动图集
        // 得到一个空壳 SpriteAtlas, 没有任何精灵帧 (似乎 Build 运行是正常的)
        resources.load('autoAtlas/auto-atlas', SpriteAtlas, (e,res)=>
        {
            console.log("autoAtlas loaded");
            console.log(res.getSpriteFrame('asdf')); // NULL !
        });
    }
}

所以, 现在有 2 个问题: (版本 3.4.1)

  1. 对于 TP 图集, 加载 (代码加载 / prefab引用) 的时候, 会导致请求每一帧的信息.json, 严重影响加载速度
    TP的 plist 应该默认转换为一个 json, 而不是拆分成一堆 json

    • 不过, 有一个 “合并 JSON” 的 bundle 选项, 算是可以克服这个问题. 但使用体验差, 开发者要为了这个技术细节去考虑如何分包, 而且容易会忘记. (分裂的是, 自动图集不需要这样做, 只有一个 json).
  2. 对于 自动图集, 在预览模式下无法加载为有效的 SpriteAtlas, 进而无法调试:
    预览模式应该正常处理自动图集

export class Hello extends Component
{
    start()
    {
        // sp.spriteAtlas 已在编辑器中设置 pac 资源
        const sp = this.node.getChildByName('asdf').getComponent(Sprite);
        // 动态切换帧 - 预览模式 sp 消失, 构建运行正常
        sp.changeSpriteFrameFromAtlas('asdf');
        // OR
        // sp.spriteFrame = sp.spriteAtlas.getSpriteFrame('asdf');
    }
}

tp用起来

资源压缩,放远程,loading的时候下载并解压,放缓存里

  1. 每个 spriteframe 都有一个对应的 json,包括图集内的散图,目前设计是这样
  2. 自动图集就是在构建后才将碎图合并的,预览的时候获取不到散图信息也是正常的。

1.pc上用浏览器直接预览的时候是没有进行碎图合并,构建后才会合成大图。所以电脑上和手机上是不一样的。如果已经构建成了微信小游戏则是已经合图后的。
2.碎图尽量不要放在Resource目录下,因为放在这里就会所有spriteframe都生成一个json。
3.构建的时候有一些spriteframe 相关的选项

所以说这个设计很分裂, 比如我有一个属性:

@type(SpriteAtlas) atlas

在编辑器里,

  • 如果我用 TP 图集 (一个plist + 一个png), 一不小心就产生一堆额外请求. (要记得分包合并 JSON)
  • 而如果用 PAC 自动图集, 预览的时候又不能 atlas.getSpriteFrame('xxx'). (要记得构建运行才能测试)

于是在每个使用这个组件的地方, 需要特别小心不然就踩坑.

希望将来两种图集能一致化

这种问题显然是技术细节造成的使用体验缺陷, 为什么几年过去了, 引擎/编辑器不去改进, 而期望开发者了解每一个奇奇怪怪的细节呢?

看到官方自动图集的功能,所以迫不及待的替换了texturePacker,结果发现 生成的auto-altas拖拽到属性面板上获取到的是null ,即楼主所说的问题。
希望官方考虑一下啊,不太想在使用cocos creator的同时还有借助一堆外部的工具来操作了。

2赞

COCOS的图集功能确实是一个很大的缺点.

这算什么。我们有4-5k的加载。等的很酸爽

你好,这个问题是之前版本的一个 bug,3.5 已经修复过了。

目前使用cocoscreator 3.8.4还是会产生几个k的json加载