《Creator 2.x ~ 3.8.1》谨慎使用常驻Node, 有坑, 会自动释放bundle资源 (附DOME)

重新步骤 :

// 先给常驻节点加载有资源的 chlid node
myNode.getChildByName(‘Spine’).getComponent(sp.Skeleton).skeletonData = myData;
// 加载常驻
cc.game.addPersistRootNode(myNode);
// 移除资源
myNode.getChildByName(‘Spine’).getComponent(sp.Skeleton).skeletonData = null;
// 移除常驻
cc.game.removePersistRootNode(myNode);

通过上面removePersistRootNode步骤, myData会被removePersistRootNode步骤释放掉

myDate 是手动通过 cc.resources.load(‘xxx’) 加载的,按理来说应该是要手动释放,但却被removePersistRootNode给释放了

Dome:

// UIBg/dome 设置自己的图片资源
		cc.resources.load('UIBg/dome',cc.SpriteFrame,(err, myData)=>{

			let node = new cc.Node()
			let sprite = node.addComponent(cc.Sprite);
			sprite.spriteFrame = myData;
			node.parent = cc.director.getScene();
			cc.game.addPersistRootNode(node);
			console.info('addPersistRootNode 资源是否存在', myData.isValid, cc.resources.get('UIBg/dome', cc.SpriteFrame))
			cc.game.removePersistRootNode(node);
			console.info('removePersistRootNode 资源是否存在', myData.isValid, cc.resources.get('UIBg/dome', cc.SpriteFrame))
			setTimeout(()=>{
				console.info('延迟100ms 资源是否存在', myData.isValid, cc.resources.get('UIBg/dome', cc.SpriteFrame))
			},100)
		})

Dome输出

image

版本: 2.x ~ 3.8.3
平台: 所有平台

这操作都给我看懵了,有移除需求的节点为什么要设置常驻呢?

:rofl: :rofl: :rofl:有道理

大致猜测你的方式
你有一个脚本绑定在这个myNode上并且你的myData在这个脚本上
或者你的myData直接绑定在这个常驻节点上
如果不是,那么这个销毁大概确实有问题,可以给出完整的demo看下

估计案例上的myData应该是绑脚本上而不是透过cc.resource.load 或 bundle.load方法加载, 这様myData在myNode被销毁时引用计数不是就会为0 然后释放掉?

myDate 是手动通过 cc.resources.load(‘xxx’) 加载的,按理来说应该是要手动释放,但却被removePersistRootNode给释放了

是手动cc.resource.load加载的

总有特殊情况用到,项目动态适配4:3和普通长屏幕分辨率用到移除常驻,这里只讨论bug不讨论具体适配方案

Creator 2.x ~ 3.8 版本全都有这问题