如何释放loadRemote加载的图片资源

如题,我使用如下代码加载了一张图片,并且赋值给了一个精灵

assetManager.loadRemote(url, function (err, image: ImageAsset) {
      if (err) {
        return log(err);
      }

        let frame = new SpriteFrame();
        frame.texture = image._texture;
        this.headSprite.spriteFrame = frame;
    });

这样子写是没有问题的。我现在很频繁的调用这个代码。比如说每5秒一次。加载一个远程的图片资源赋值给我的精灵。会发现内存有规律的暴涨。我觉得是因为随着加载次数的增多。内存中图片资源越来越多。导致的。我尝试如下写法

let oldFrame = this.headSprite.spriteFrame;
assetManager.releaseAsset(oldFrame);

在每次加载新的图片之前,都先通过assetManeger去释放旧的图片。但是没有效果。

于是我换成这种写法,然后一堆报错。游戏也出现了大量的花屏之类。

let oldFrame = this.headSprite.spriteFrame;
assetManager.releaseAsset(oldFrame.texture);

:rofl:不知道正确的写法应该是什么样子的哦。

图片有缓存的。第一次是加载,后面就是直接读的缓存了。内存涨是其他东西引起的。

你理解错了。我是每次加载图片的url都不一样的。
比如说每10秒加载一次,。分别是
“1.png”
‘2.png’
‘3.png’
‘4.png’
这个样子的

可能需要从这里删除 cc.assetManager.cacheManager.cachedFiles

这个缓存管理器 看着像是 将从网络上的资源保存到本地硬盘上的一个东西。我现在的需求是从内存中释放已经加载进去内存中的纹理。可能不是这个方向。

this.headSprite.spriteFrame 的精灵是你现在正在使用的。
你可以试试在cc.loader[ “_cache” ]缓存组里找到你之前的资源,然后在调用释放试试

问题解决了吗?

let url = '远程资源url'
let asset = cc.assetManager.assets.get(url) //想释放,应该已经加载过了吧,所以直接get
if(asset){
    cc.assetManager.releaseAsset(asset) //释放引用
    cc.assetManager.cacheManager.removeCache(url) //清除缓存
}
3赞

没有用,内存还是持续不减

兄弟你解决了吗?

有解决了吗

没有解决,顶贴,希望官方能看到

如果远程加载的是图片,实际返回的图片资源是ImageAsset的,在引擎缓存里面储存的也是这个东西。如果需要回收掉该资源的话,只能释放该ImageAsset资源,回收上层的SpriteFrame和Texture都是没用的。因为SpriteFrame和Txeture跟远程加载的ImageAsset没有创建依赖关系,所以引擎没办法回收掉。正常加载图片都是加载的SpriteFrame,引擎会自动创建依赖关系,所以官方的方法可以回收掉。可以往这个方向试试,之前我的项目也是内存没办法回收掉,发现是这个问题后,引擎是可以正确回收的。

真正占用内存的是 Texture2D 对象。具体可以参照下这篇文章 https://www.chuyouxiang.com/archives/940。