AssetBundle的卸载
2017-10-23 本文已影响655人
晓龙酱
要点:
-
当场景中的object被移除后,Unity不会自动的卸载相关Asset
-
Asset卸载清理是特定的时刻触发,也可以手动触发
-
在合适的时刻卸载AB很重要,否则有可能会导致Asset冗余,也有可能导致Asset丢失引用
AssetBundle.Unload(bool)
-
卸载AB对象头信息(header information)
-
是否卸载通过此AB实例化的Asset
AssetBundle.Unload(true)
-
卸载实例化的Asset,如果其中某些Asset被场景引用,则会出现丢失
-
通过这种方式,资源卸载最彻底,完全从内存移除
-
即使代码中有引用此资源,也会被移除
-
使用场景:
a. 建议大多数时间使用此接口,避免出现Asset冗余
b. 在场景切换时调用,以清理旧场景的资源
AssetBundle.Unload(false)
-
断开AB与其Asset之间的关联(危险)
-
并不会卸载其Asset,所以引用不会丢失,同时Asset还会继续占用内存
-
由于AB断开了与其Asset之间的关联,所以再次从AB实例化Asset时,并不会直接返回以前初例化过的Asset,而是重新实例化。这就出现了冗余,同样的Asset,内存中出现了两份!
-
使用场景:
a. 不建议使用
b. 在场景与代码中移除相关Asset的引用,执行Unload(false),之后再执行Resources.UnloadUnusedAssets。
c. 执行Unload(false)后,切换场景(non-additively)。
Resources.UnloadUnusedAssets
- 卸载不在被引用的Asset
- 如果Asset仍被AssetBundle引用,则不会卸载
- 如果Asset被场景引用,则不会卸载
- 如果Asset被代码引用,则不会卸载
- 调用消耗较大,一般建议调用前先调用AssetBundle.Unload接口
- 在切换场景(非Addtively),引擎会自动调用