在开发中,发现new出来的Texture2D赋值到RawImage组件上时,上一个赋值的Texture2D没有被释放,一直在内存中占用,手动调用CG也不行。发现这种现象时,是想研究一下unity的Memory Profiler 内存分析器时发现这个问题。

参考文章

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

https://www.bilibili.com/read/cv14526463/

https://blog.csdn.net/thinbug/article/details/118760149

https://blog.csdn.net/linxinfa/article/details/108347571

过程

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

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

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

翻译后

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

解决方案

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

同时网友也提供了个方案,使用Resources.UnloadUnusedAssets也能销毁