远程 url 加载的图片,释放资源失败,并且报出警告:unknown asset type cc_SpriteFrame(版本 1.9.1)

Png 图片的加载和内存释放 继续讨论:

远程 url 加载的图片,释放资源失败,同时报错(版本 1.9.1)
我这边的图片是从远程 url 动态加载的,然后释放的时候,释放失败,并且报错:

然后,我尝试直接释放相应的 spriteFrame ,就报 webgl 错:

求解。。跪求解。。。我哪里的姿势不对吗??

我觉得你的贴图和报错信息贴反了,当你尝试用 url 释放时,报错应该是 WebGL bindTexture 的错误。当你使用 SpriteFrame 去释放时,应该报 “unknown asset type cc_SpriteFrame”

原因是你加载的是一个 texture,而 SpriteFrame 是你手动生成的,并不是加载出来的,所以 Loader 中只保存了 texture 信息,当你尝试用 SpriteFrame 去释放的时候,Loader 找不到相关的资源,会告诉你 unknown asset,但是当你用 url 去释放的时候,应该是可以成功的,并且调用了 gl.deleteTexture,这才导致了 WebGL 报错,因为你的场景中还在使用这张贴图。

需要注意的是,JS 的垃圾回收是当一个对象没有任何引用时才会回收,如果你从 loader 中释放了一个资源,但是场景中仍然在使用这个 SpriteFrame / Texture JS 对象,那么场景中的引用仍然是有效的,不会被自动解除引用。但是 gl texture 并不是由 JS 垃圾回收来管理的,只能手动管理,所以我们认为当你从 Loader 中释放一个贴图时,就不再需要这张贴图了,我们就会将它的 gl texture 手动从 GPU 内存中释放,此时我们无法检查你的场景对贴图的实际引用状态,也不会做这样的检查。

感谢 panda 大大的回复。
抱歉,报错贴图的确贴反了,是尝试用 url 释放的时候报了 webgl 的错。
但是,场景中我这张图片只是在这里使用到了而已,其他地方并没有使用它,为什么释放还是会报错呢?需要怎么样才能用url释放成功呢?求解决方案,谢谢:pray:

我尝试了先将之前 new 出来的 spriteFrame 清空,然后再释放,就不报错了,图片也释放成功了!
即在适当之前:
this.mainPicSprite.spriteFrame = null;
然后再用 url 释放就可以了。
感谢:pray:

mark