加载多个同路径的远程资源,GFX Texture Mem也包含多份内存

QQ图片20220105135523

通过文档的加载方式,10个精灵节点加载同一路径同一张远程图片资源。
GFX Texture Mem占用是10份内存。
当遍历10个精灵节点按照以下方式移除
sprite.spriteFrame.decRef();
sprite.spriteFrame = null;
sprite.node.destroy();

assetManager.assets缓存里是没有这些资源了,但是GFX Texture Mem内存还剩下9份内存,并不是0;


经过调试发现,调用decRef的时候,引用计数减1后,会调用tryRelease尝试释放
最终add到_toDelete列表里。是以uuid为key存储的列表。
所以遍历10个节点的spriteFrame.decRef(),最终_toDelete列表也只会存储一份,也就只会执行一次asset.destroy();
调用asset.destroy(),最终会触发GFX Texture Mem的内存计算,就是说也只会处理一次。剩余的9次还存在。

现在我的疑问是
1.像这样加载远程资源,同一路径的图片加载N次,GFX Texture Mem内存就会占用N份,这样是否是正常的?
2.怎么可以把GFX Texture Mem剩下的内存释放掉?
3.假如第一条的问题是正常的话,那么想要加载非首包的资源(也就是远程资源),又想要GFX Texture Mem内存只占用一份的话,是不是就只能用Asset Bundle的方式去处理?

1赞

哪里看到GFX Texture Mem有多少份?
不知道2.4.x会不会有这个问题

多个节点加载显示同一张远程图片资源,你看看WebGLTexture的initialize方法进来几次

GFX Texture Mem 是在 Texture 被创建的时候去申请的,释放的时候,你有释放 texture 么,看你贴的代码只释放 SpriteFrame

texture.decRef();
assetManager.releaseAsset(texture);
你是说这两个释放吗,这两个最终都会走到tryRelease。最终还是存储在this._toDelete。
10个texture,释放10次,this._toDelete只会存在一份,因为同一份资源texture的_uuid都是相同的。还是只释放了一次

我下载的也是网图,列表滑动的时候会一直下载新图,这个时候GFX Texture Mem会一直涨,但是一段时间以后,这个值又会恢复,我没有对spriteFrame和texture进行销毁,为什么GFX Texture Mem这个值会降回去呢?