[BUG] 2.0.9 是不是增加了一个运行时动态合图集的特性?怎么关闭

如题。
更新2.0.9之后,经常发现,通过 cc.loader.loadRes 加载的图片,第二次加载后就花屏了。
经查发现,第二次加载后,实际加载后的 spriteFrame.getTexture() 变成了一个 2048*2048 的RenderTexture。
然后渲染出来是一张大图集,造成了花屏。

看样子像是2.0.9增加了一个 运行时动态合图集的功能。
但是这个功能目前看来并不稳定,请问有什么方法可以关闭?

@jare

如图,选择框里的图标,是通过cc.loader.loadRes动态加载的,第二次加载时,就会出现这样的问题。

1赞

cc.dynamicAtlasManager.enabled = false; 找个地方添加这个代码

额,这个功能目前是稳定的,从2.0开始就已经添加了这个功能了。主要可能是你理解上的一点问题
你第二次去加载,其实这个资源已经加载过了,因此不会进行再次的加载。这个cc.loader.load对动态合图并没有任何关系。
你如果不进行第二次的cc.loader.load,你延迟一下,然后取texture,取出来的就是动态合图后的2048*2048的纹理资源。这个动态合图和你进不进行二次load没有任何关系。

如果你要关闭动态合图,可以在game.js中添加

dynamicAtlasManager.enabled = false;

来关闭这个功能

感谢!
验证之后发现问题主要是这样的:

重现路径:

  1. 我有一个Sprite
  2. 我先创建了一个空的SpriteFrame
  3. loadRes后,对上述空的SpriteFrame进行了 setTexture(加载后的SpriteFrame) 操作
  4. 由于后面的参数(例如rect、originalSize等)没传,导致图集没有对应上(因为获取到的SpriteFrame是2048*2048的图集)

建议:
SpriteFrame除setTexture外,是否也可以支持一个 set(SpriteFrame) 的方法。(loadRes后,再赋值给一个已有SpriteFrame,也是挺常见的操作)

setSpriteFrame的话直接对spriteFrame赋值即可

sprite.spriteFrame = new cc.SpriteFrame();

或者

cc.loader.loadRes("xxx", cc.SpriteFrame, (err,frame) => {
    sprite.spriteFrame = frame;
})

我的场景是这样:

有一个 【怪物图标】,在全局多个场景中会用到。
所以为了性能起见,我会放一个全局静态的 SpriteFrame,在用到的地方直接赋值给Sprite。

当需要显示时,才去加载这个SpriteFrame,其后通过setTexture的方式直接修改SpriteFrame(而不是给许多用到的Sprite一一重新赋值)

这应该也是一个挺常见的场景,就好像很多 image 指向同一个src。