- Creator 版本:2.4.9
- 目标平台: Mac Big Sur 11.6.6 Safari 15.5
最近项目从creator2.2.2升级到2.4.x,发现web版本内存占用变大,并且资源释放后,内存不能完全回收。于是写一个简单测试工程验证内存问题:
creator 2.4.9:
scene1里有个按钮点击后跳转scene2,加载31张2048*2048的图片并显示,scene2里点back按钮,销毁图片并回到scene1。(scene2里等待加载完再点返回,没做中断处理)
onLoad: function() {
var self = this;
for(let i = 0; i <= 30; i++){
var texName = 'battle - ' + this.prefixZero(i, 3)
cc.resources.load(texName, cc.SpriteFrame,function(err,spriteFrame){
var node = new cc.Node('myNode');
const sprite = node.addComponent(cc.Sprite);
sprite.spriteFrame = spriteFrame;
self.rootNode.addChild(node);
self.texArr.push(spriteFrame.addRef());
})
}
},
onDestroy () {
this.texArr.forEach(x => x.decRef());
this.texArr = null;
},
safari控制台里查看scene1,scene2的cc.assetManager.assets,切换多次后,比较正常:
scene1:
Cache {_map: Object, _count: 27, add: function, get: function, …}
scene2:
Cache {_map: Object, _count: 89, add: function, get: function, …}
scene1:
Cache {_map: Object, _count: 27, add: function, get: function, …}
scene2:
Cache {_map: Object, _count: 89, add: function, get: function, …}
在safari的timeline里,跟踪memory,多次切换,内存保持上涨状态:
scene1 1: JS heap: 20.82MB; Page: 97.80MB
scene2 1: JS heap: 432.87MB; Page: 1.20GB
scene1 2: JS heap: 440.27MB; Page: 546.18MB
scene2 2: JS heap: 516.32MB; Page: 1.27GB
scene1 3: JS heap: 521.22MB; Page: 583.18MB
scene2 3: JS heap: 398.22MB; Page: 1.30GB
scene1 4: JS heap: 402.59MB; Page: 604.03MB
scene2 4: JS heap: 497.77MB; Page: 1.32GB
scene1 5: JS heap: 549.13MB; Page: 725.69GB
scene2 5: JS heap: 554.06MB; Page: 1.40GB
scene1 6: JS heap: 548.17MB; Page: 662.26MB
scene2 6: JS heap: 552.92MB; Page: 1.43GB
scene1 7: JS heap: 547.86MB; Page: 697.02MB
scene2 7: JS heap: 552.92MB; Page: 1.43GB
切换多次后,JS Heap最多能到1.59GB,Page最大2.20GB。有时又能回落:JS Heap到500MB+,Page到800MB+。
同样的逻辑,2.2.2版本:
onLoad: function() {
var rootNode = this.rootNode;
var textArr = this.textArr;
var nodeArr = this.nodeArr;
for(let i = 0; i <= 30; i++){
var texName = 'battle - ' + this.prefixZero(i, 3)
cc.loader.loadRes(texName, cc.SpriteFrame,function(err,spriteFrame){
var node = new cc.Node('myNode');
const sprite = node.addComponent(cc.Sprite);
sprite.spriteFrame = spriteFrame;
rootNode.addChild(node);
textArr.push(spriteFrame);
})
}
},
onDestroy () {
for(let i = 0; i <= 30; i++){
var assets = cc.loader.getDependsRecursively(this.textArr[i]);
cc.loader.release(assets);
}
this.textArr = null
},
safari控制台里查看scene1,scene2的Object.keys(cc.loader._cache).length,切换多次后,比较正常:
scene1: 26
scene2: 119
scene1: 26
scene2: 119
在safari的timeline里,跟踪memory,多次切换:
scene1 1: JS heap: 31.55MB; Page: 94.70MB
scene2 1: JS heap: 50.03MB; Page: 618.06MB
scene1 2: JS heap: 50.73MB; Page: 133.12MB
scene2 2: JS heap: 23.82MB; Page: 667.92MB
scene1 3: JS heap: 24.59MB; Page: 148.87MB
scene2 3: JS heap: 24.40MB; Page: 667.64MB
scene1 4: JS heap: 25.49MB; Page: 147.36MB
scene2 4: JS heap: 39.68MB; Page: 653.72MB
scene1 5: JS heap: 24.08MB; Page: 148.91MB
scene2 5: JS heap: 25.30MB; Page: 667.71MB
scene1 6: JS heap: 25.53MB; Page: 147.80MB
scene2 6: JS heap: 39.69MB; Page: 654.06MB
可以看到JS Heap和Page内存比2.4.9小很多,并且内存可以干净的回收。
总结:
mac safari上,2.4.9 加载释放资源占用内存比2.2.2大,并且内存无法完全回收。
请cocos的同学帮忙看下,着急解决,多谢了!
测试工程下载:
链接: https://pan.baidu.com/s/1YPjViNWVXgmAXQ9kl6_wag 提取码: 685g