AssetBundle的卸载

要点:

  • 当场景中的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),引擎会自动调用

https://docs.unity3d.com/Manual/AssetBundles-Native.html

你可能感兴趣的:(AssetBundle的卸载)