重现方式:
- 开启动态合图
- 场景中添加一个 Label,并将 CacheMode 设置为 BITMAP
- 通过 cc.internal.dynamicAtlasManager._atlases[0]._innerSpriteFrames 可以看到动态合图中 Label 对应的位图信息
- 将 Label 对象 destroy
- Label 对应的位图信息仍然存在于 cc.internal.dynamicAtlasManager._atlases[0]._innerSpriteFrames 中无法移除
问题分析:
label.ts::onDestroy 中的处理为:
public onDestroy () { ... if (this._ttfSpriteFrame) { this._ttfSpriteFrame._resetDynamicAtlasFrame(); ... this._ttfSpriteFrame.destroy(); ... } }
由于在 _resetDynamicAtlasFrame() 时已经将 spriteFrame 的 _original 重置为 null,之后在尝试将 spriteFrame 从动态合图中移除时会失败(见 dynamicAtlasManager.deleteAtlasSpriteFrame 中关于 _original 的判断),表现为字体位图无法从动态合图中移除。