[unity3D]assetbundle卸载方案

前言

关于ab包的卸载,最重要的一部分就是实例化以后的gameobject还依赖这个ab包的资源导致ab包卸载以后gameobject会出现资源丢失,但是如果不被卸载,内存就会持续增加。现阶段有两个方案1:引用计数,被引用了几次;2:弱引用,销毁gameobject内存回收,引用自动消除。

assetbundle卸载原理

当场景中的object被移除后,unity不会自动卸载相关的asset,所以asset的卸载需要我们自己来调用。Asset卸载清理可以是特定时刻卸载,也能手动强制卸载。

调用方法为Assetbundle.Unload(bool)和Resource.UnLoadUnusedAssets这两个方法。

AssetBundle.Unload(true)

卸载实例化的Asset,如果其中的某些asset还在被object所引用,就会出现丢失情况

通过这种方法卸载,资源会被卸载的很彻底,完全从内存移除即使还在代码中引用,也会被移除。

AssetBundle.UnLoad(false)

切断ab与其asset之间的关联,不会卸载asset,所以引用不会丢失,asset还在内存中,但是切断例联系,所以再次从ab包中实例化asset的时候不会返回已经初始化过的asset,而是重新实例化,就会出现asset的冗余。

Resource.UnloadUnusedAssets

卸载不被引用的asset,如果asset被gameobject引用,不会卸载。

被场景引用,不会被卸载

被代码引用,不会被卸载。

调用的消耗很大,该函数的主要作用是查找并卸载不再使用的资源。

Asset的引用计数卸载方案

主要是当加载asset的资源的时候,加载一次计数+1,卸载一次计数-1,当减到不用当时候就可以unloadAsset了。

在做UI当资源管理当时候,因为当前所用的资源都是这个window窗口的。所以可以用一个资源栈来做。当打开一个窗口当时候,做一个标志位,在这个标志位以上的资源都是这个窗口所使用加载的。当关闭窗口的时候,把这个阶段的资源全部卸载掉。使用栈就需要窗口的打开和关闭是一一对应的。

Asset的弱引用卸载方案

关键词WeakReference。这个类的作用就是可以在GC的时候释放对象,回收内存。当我们把Asset做弱引用,那当产生一次GC的时候,我们就可以调用Resource.UnloadUnusedAssets来回收Asset。这个方法的危险点就是在于调用Resource.UnloadUnusedAssets的时候消耗很大,所以调用的时机得把握好。AssetBundle.UnLoad(false)也可以,但是释放对象得走一次GC,c#的GC自动调用的时间不知道,手动调用的话会使内存一下增加很多。