在开发中,发现new出来的Texture2D赋值到RawImage组件上时,上一个赋值的Texture2D没有被释放,一直在内存中占用,手动调用CG也不行
先说解决方案
//更新RawImage上的图片前,先检查是否存在,如果存在,销毁旧的
if (RawImage.texture)
{
Destroy(image.texture);
}
//如果仅仅在代码中使用,则在用完后马上销毁
UnityEngine.Object.Destroy(texture2D)
//或者使用对象池,有一个函数,可以重新初始化texture2d
texture2D.Reinitialize()
先贴一下我搜到的一些解决方案文章,也是他们给我提供了一些解决思路:
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,发现占用还是存在。可能仅仅是把那块内存休眠了吧?!