3.8.2动态合图问题

  • Creator 版本: <3.8.2 -->

  • 目标平台: 谷歌浏览器,web预览

  • 问题描述:web预览游戏的时候,我创建了一个界面来渲染当前场景的动态合图,当我打开
    一个弹窗的时候,发现弹窗的ui被反复合到动态合图中了,

预览合图的代码如下:
ps:在每次渲染前我有打印,能确认容器渲染之前是空的。
image

弹窗ui被反复合的显示如下:
image

1赞

你用代码动态创建了spriteFrame。这个spriteFrame会动态合图进去。每次动态创建一个就又塞了一个进去。你把你自己创建的spriteFrame的packable设置为false,不让它合图进去试试。

问题在于它不应该重复合进合图里面,不是在于我是否想控制它合进去

动态合图 不会根据这张图片没被引用就清除 每次动态创建都会重新塞进去 只有当合图空间没了的时候才会清除整张合图 然后又新建一张空的在塞进去

官方是这么解释得:
Cocos Creator 提供了 动态合图 (Dynamic Atlas)的功能,它能在项目运行时动态地将贴图合并到一张大贴图中。当渲染一张贴图的时候,动态合图系统会自动检测这张贴图是否已经被合并到了图集(图片集合)中,如果没有,并且此贴图又符合动态合图的条件,就会将此贴图合并到图集中。
所以我得理解是它不应该被重复合进去吧。

你重新 new了就不行了吧 image

官方也是根据图片的id来判断来着 如果你的图片id并不一样就会重复加载,每次重新new都会生成一个新的图片id 因为官方不是根据唯一ID来判定的

因为你重新new了一个spriteFrame。所以新的spriteFrame会被再次合图进去。因为新的spriteFrame和旧的不是同一个对象。

追加一个label组件BITMAP缓存参与动态合图的bug
官方的解释如下:
image
静态字体设置为BITMAP缓存模式,发现这些字体竟然会随着显示隐藏反复的合并到动态合图中,我认为引擎组大佬们初衷应该是在没有反复初始化的时候应该只会被合一次吧,希望也一并看看这个问题并得到回复,谢谢。

这个问题很早就有了。spriteFrame具有自己的唯一id,可以判定去重,文本内容是没有一个唯一id的。
简单的解决方法是用对象池把一些文本对象存起来,避免反复创建。
彻底的解法可以参考以前乐府的文章,用文本尺寸、文本内容、颜色等组合成一个id来做标识,修改源码中的合图逻辑。
https://forum.cocos.org/t/label-1-bitmap/97573/13

感谢关注,这个麒麟子大佬已经在关注优化了,相信后面的版本我们能使用到完善的自动合图功能 :grinning:

这个问题的暂时的解法
packToDynamicAtlas 这个动作的时候,textureid 改写成 string + color + fontSize + fontFamily + outLineColor + outLineWidth 的标识
这样就不会重复去创建

确实, 反复显示隐藏都会导致重复添加到合图, 那这个功能就太有限制了