调用SpriteFrame.createWithImage内存无限上涨的BUG

调用sp.spriteFrame = SpriteFrame.createWithImage(imgAsset); 内存一直涨

用网页谷■跑Google Chrome Helper (GPU) 一直增高
用creator跑CocosCreator Helper(GPU) 一直增高

确认只要sp.spriteFrame = SpriteFrame.createWithImage(imgAsset); 注掉就正常了,一create内存涨了就清不掉
image
没换几个图几分钟内存80G了

顶帖,我也发现了,@官方

public static createWithImage (imageSourceOrImageAsset: ImageSource | ImageAsset): SpriteFrame {
   const img = imageSourceOrImageAsset instanceof ImageAsset ? imageSourceOrImageAsset : new ImageAsset(imageSourceOrImageAsset);
   const tex = new Texture2D();
   tex.image = img;
   const spf = new SpriteFrame();
   spf.texture = tex;
   return spf;

}

使用完之后自己释放下tex呗……

试了 确实是如果不停动态加载,上一次动态创建的texture无法释放

测试sp.spriteFrame = null似乎没用

DDDDDDDDDdddddD顶顶顶顶

试试看在重新赋值前 拿到上一个spriteFrame的tex 并把tex释放const spf = sp.spriteFrame; sp.spriteFrame = null; const tex = spf.texture; tex.destroy();

图片不显示了。。

这正常呀, 你手动创建纹理,又不走cc.assetManager.assets.get/set 进行缓存与取缓存, 直接不断建texture然后texture.image = ImageAsset 等于webgl不断重复创建纹理, 内存一定是会一直涨的。 估计官方提供这个接口只是为了用来做些简单逻辑, 需要缓存要靠自己

老哥怎么卸掉之前动态创建的呀,老版cocos-js跟unity没写自己删除都是自动管理的,他官方应该在createWithImage是检查之前的没用就该释放掉的吧?

顶顶顶顶顶顶顶顶

尝试半天没写出来

顶呱呱顶呱呱


尝试spriteFrame.rest(); 因为延迟执行导致 马上重置的图片也被删掉了,查看updateRenderData发现没有对应接口

今天测试把console.log 跟console.error屏蔽掉就好 :joy: :joy: :joy: 目前看是log太多的锅

还是不行呀,再家里测试新项目好的,公司环境去掉log换图还是一直涨,难道有什么引擎配置不同造成的? :grimacing:

我记得动态加载第三方图片挺危险的,比如头像啥的,如果没释放好,内存就泄露了 :joy:

目前是bundle内的本地图

一张图片加载成功后存到一个map里面去,下次用到的时候先从map里面取,这样就不会无限上涨了

import { _decorator, Component, Node, resources, ImageAsset } from ‘cc’;
import * as cc from ‘cc’;
const { ccclass, property } = _decorator;

@ccclass(‘changeImageTest’)
export class changeImageTest extends Component {
isStop = false;
start() {

    cc.input.on(cc.Input.EventType.KEY_DOWN,(event: cc.EventKeyboard)=>{
        switch (event.keyCode) {
            case cc.KeyCode.KEY_A:
                this.isStop = true;
                break;
            default:
                this.isStop = false;
                break;
        }
    }, this);
}
update(deltaTime: number) {
    if(this.isStop){
        return
    }
    for (let i = 0; i < 100; i++) {
        resources.load("testImage" + 1, ImageAsset, (err, asset) => {
            this.getComponent(cc.Sprite).getComponent(cc.Sprite).spriteFrame = cc.SpriteFrame.createWithImage(asset);

        });

    }
}

}
写了个小demo