Unity Texture2D内存无法释放,一直占用问题

697 阅读2分钟

在开发中,发现new出来的Texture2D赋值到RawImage组件上时,上一个赋值的Texture2D没有被释放,一直在内存中占用,手动调用CG也不行

先说解决方案

//更新RawImage上的图片前,先检查是否存在,如果存在,销毁旧的
 if (RawImage.texture)
{
    Destroy(image.texture);
}
//如果仅仅在代码中使用,则在用完后马上销毁
UnityEngine.Object.Destroy(texture2D)
//或者使用对象池,有一个函数,可以重新初始化texture2d
texture2D.Reinitialize()

先贴一下我搜到的一些解决方案文章,也是他们给我提供了一些解决思路:

www.bilibili.com/read/cv1452…

blog.csdn.net/thinbug/art…

blog.csdn.net/linxinfa/ar…

解决过程

在排查性能过程中,发现Texture2D一直在占用内存,即使覆盖也还是存在,引用计数一直为1,手动GC也无法释放,然后百度搜罗一下解决方案,发现Texture2D似乎unity无法自动托管,也无法检测当前的Texture2D是不是仍在使用(引用计数都不用了,也还存在)。只要被New过后,就一直存在在内存中(Unity你别tmd搞营销了,修修bug不好吗?)。

所以只能进行手动调用销毁来释放其在内存中的占用。

​编辑

按F12进入到RawImage的函数里,看到这个注释:​编辑

翻译后

​编辑

题外话:在排查中发现一个神奇的东西,在任务管理器中看到内存一直涨后,我用360加速球清了一下,任务管理器的unity内存是被成功的释放了,肉眼可见内存占用少了,但跳回到unity,发现占用还是存在。可能仅仅是把那块内存休眠了吧?!