有这么个场景,用UnityWebRequest或www或besthttp方式从网络下载图片资源,然后转成texture2d在unity程序中显示。但频繁切换或关闭打开后,会发现内存占用越来越大,最后就白屏无响应了。
为什么明明destroy了ui 的gameobject,资源却不释放呢? 原来unity的资源有一层缓存机制,不管是否被调用,在启动资源清理功能前都会驻留在内存中了。
定位问题
在unity编辑器中运行程序,
然后打开window -》Profiler, 往下拉,看到Memery,点击下面工具栏的simple,选择detailed,就会出现当前的程序资源占用情况
选择scene asset,找到texture2d 就时当前程序中所有texture2d资源(图片资源),后面的数字是引用,如果后面数字消失了,那么这个就是可以卸载的,如果数字一直存在,就不能卸载。
卸载未被调用的资源
调用以下两行代码,未被调用的资源就会被卸载
Resources.UnloadUnusedAssets();//卸载未占用的asset资源
System.GC.Collect();//回收内存
卸载被盗用的资源
如果该资源被metarel 调用,那么就调用该材质对象的SetTexture("_MainTex", null);
然后在使用卸载函数。
Resources.UnloadUnusedAssets();
System.GC.Collect();
自动清理内存
正常情况下,unity 在运行时,如果有足够的内存空间,就会一直不停的分配内存,不会清空未调用资源。当内存不足时才会自动调用内存清理。