/**
* cocos creator:动态图集
* 使用理由
* > 降低drawcall从而提升游戏运行效率
* 限制
* > 场景切换时,才会释放动态图鉴(造成内存的消耗)
* > 同一场景下,最多存在5张
* > maxsize 2048.2048
*
*/
cc.debug.setDisplayStats(true);
// 强制开启动态图集
cc.macro.CLEANUP_IMAGE_CACHE = false;
cc.dynamicAtlasManager.enabled = true;
const {ccclass, property} = cc._decorator;
@ccclass
export default class Helloworld extends cc.Component {
start () {
// init logic
for(let i = 0;i < 10;++i){
cc.loader.loadRes("HelloWorld",cc.SpriteFrame,(err,spriteFrame:cc.SpriteFrame)=>{
let node = new cc.Node();
node.addComponent(cc.Sprite);
node.getComponent(cc.Sprite).spriteFrame = spriteFrame;
node.x = -500 + i* 100;
this.node.addChild(node);
})
}
this.node.runAction(cc.sequence(
cc.delayTime(2),
cc.callFunc(()=>{
// 释放资源
cc.loader.releaseAll();
}),
cc.delayTime(2),
cc.callFunc(()=>{
// 加新的图片
cc.loader.loadRes("HelloWorld",cc.SpriteFrame,(err,spriteFrame:cc.SpriteFrame)=>{
let node = new cc.Node();
node.addComponent(cc.Sprite);
node.getComponent(cc.Sprite).spriteFrame = spriteFrame;
this.node.addChild(node);
console.log("HelloWorld", spriteFrame);
})
cc.dynamicAtlasManager.showDebug(true);
}),
cc.delayTime(2),
cc.callFunc(()=>{
console.log("dynamicAtlasManager");
// 发现动态合图出现了两张一样的图片
// 查看源码可知道(manager.js->insertSpriteFrame->atlas.js->insertSpriteFrame),
// 动态图集是通过texture._id来进行查找的、合图
// 而texture._id是自增的,所以当原始资源被销毁的时候,再次进行insertSpriteFrame操作时,texture._id的改变
// 导致了无法从动态图鉴中找到该纹理,从而进行重建
// 导致问题:图鉴的无效增加-》 图集数量的增加消耗了内存、也会导致Drawcall的升高
// 解决办法:修改下源码,使用 texture._uuid 来解决
cc.dynamicAtlasManager.showDebug(true);
}),
))
}
}