unity 内存释放分析

本文分析unity,资源加载释放方式

首先材质、贴图在内存中时非常消耗内存的,unity对这些资源采用的是引用计数方式即,两个Asset用同一张贴图时,贴图在内存中并不会有两份,而是共用一份。然后对贴图引用计数进行加一,如果Asset销毁时,把对应的贴图引用进行减一,当引用计数为0时,执行Resources.UnloadUnusedAssets()或者跳转场景时,这些引用计数为0的资源会被释放。

下面讨论下三种模式下,GameObject引用图片加载释放方式。

第一种:直接在unity中创建即在Hierarchy视图中创建,销毁方式Destroy(gameobject)

这种方式GameObject会让引用到贴图加载到内存,并把贴图引用加一

执行Destroy后,会删除掉GameObject但是GameObject引用的贴图,不会被销毁,只会将贴图引用减一,虽然贴图引用为0,但并不会在内存中被释放,因为还没执行。Resources.UnloadUnusedAssets()或者场景跳转。

第二种:Resources,Load加载的方式,释放资源跟第一种一样,Destroy只会销毁物体,贴图资源需要调用Resources.UnloadUnusedAssets()或者场景跳转才释放。

第三种:Assetbundle加载方式,这个较为特殊点,首先调用AssetBundle.LoadAsset() 方法时Assetbundle会在内存创建一份GameObject,贴图引用为1。使用时Instance后会在内存中重新复制一份AssetBunlde中的GameObject,这时贴图的引用会再次加一,即此时贴图的引用计数是2

执行Destroy掉instance出来的GameObject,贴图的引用会减一即1,因为Assetbundle还对其引用着,执行Assetbundle.Unload(false)对其卸载,这时贴图的引用就变成了0,调用Resources.UnloadUnusedAssets()或者场景跳转即会释放。

也就是说Assetbundle内存释放需要我们手动调用Assetbundle.Unload(xxx);这里的xxx,可以是false也可以是true。设置false时即销毁GameObject对贴图引用减一。设置为ture时,资源释放比较强制,即使从AssetBundle中Instance出来的GameObject对贴图引用着,Assetbundle.Unload(true)时也会把贴图强制设置卸载。

你可能感兴趣的:(unity,c#,android,ios)