Creator2.4.9 web版本内存泄漏

  • 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

顶一个…

给你顶一个

关注一下… 正有项目打算升级的

顶一个,项目刚升级到2.4.9 :joy:

好的,感谢反馈,我们确认一下

测试了一下,应该是 Safari 的 ImageBitmap 实现可能有点问题,不用 ImageBitmap 来加载图片会平稳很多,可以用 cc.macro.ALLOW_IMAGE_BITMAP = false; 禁止使用 ImageBitmap 来加载图片

2赞

那影响不大 :+1:

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。