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