Unity文档——AssetBundle使用模式

AssetBundle使用模式

版本检查:2017.3

-

难度:高级

 

这是关于Unity 5中资产,资源和资源管理系列文章的第五章。

本系列的前一章介绍了AssetBundles基础知识,其中包括各种加载API的低级行为。本章讨论在实践中使用AssetBundle的各个方面的问题和可能的解决方案。

管理已加载的资产

在内存敏感的环境中仔细控制加载的对象的大小和数量至关重要。从活动场景中删除对象时,Unity不会自动卸载对象。资产清理在特定时间触发,也可以手动触发。

必须谨慎管理AssetBundles本身。由本地存储上的文件(在Unity缓存中或通过AssetBundle.LoadFromFile加载的文件)支持的AssetBundle具有最小的内存开销,很少消耗超过几十千字节。但是,如果存在大量AssetBundle,这种开销仍然会成为问题。

由于大多数项目允许用户重新体验内容(例如重放级别),因此了解何时加载或卸载AssetBundle非常重要。如果AssetBundle未正确卸载,则可能导致内存中的对象重复。不正确地卸载AssetBundles也会在某些情况下导致不良行为,例如导致纹理丢失。要了解为什么会发生这种情况,请参阅“ 资产,对象和序列化”一章的“ 对象间引用”部分。

管理资产和AssetBundle时最重要的一点是,对于unloadAllLoadedObjects参数调用AssetBundle.Unload时,行为的区别在于true或false 。

此API将卸载正在调用的AssetBundle的标头信息。所述unloadAllLoadedObjects参数确定是否还从卸载这个AssetBundle实例化的所有对象。如果设置为true,那么源自AssetBundle的所有对象也将立即卸载 - 即使它们当前正在活动场景中使用。

例如,假设材料M是从AssetBundle AB加载的,并假设M当前处于活动场景中。

描述

如果调用了AssetBundle.Unload(true),则M将从场景中删除,销毁并卸载。但是,如果调用了AssetBundle.Unload(false),那么AB的头信息将被卸载,但是M将保留在场景中并且仍然可以正常工作。调用AssetBundle.Unload(false)会中断MAB之间的链接。如果稍后再次加载AB,则AB中包含的对象的新副本将被加载到内存中。

描述

如果稍后再次加载AB,则将重新加载AssetBundle标头信息的新副本。然而,中号是不是从这个新副本加载AB。Unity不会在ABM的新副本之间建立任何链接。

描述

如果调用AssetBundle.LoadAsset()来重新加载M,Unity将不会将M的旧副本解释为AB中的数据实例。因此,Unity将加载M的新副本,并且场景中将有两个相同的M副本。

描述

对于大多数项目,这种行为是不可取的。大多数项目应该使用AssetBundle.Unload(true)并采用一种方法来确保对象不会重复。两种常用方法是:

  1. 在应用程序的生命周期中,在卸载瞬态AssetBundle时具有明确定义的点,例如在级别之间或在加载屏幕期间。这是更简单和最常见的选择。

  2. 维护单个对象的引用计数,并仅在所有组成对象未使用时卸载AssetBundle。这允许应用程序卸载和重新加载单个对象,而无需重复内存。

如果应用程序必须使用AssetBundle.Unload(false),则只能以两种方式卸载单个对象:

  1. 消除场景和代码中对不需要的Object的所有引用。完成此操作后,调用Resources.UnloadUnusedAssets

  2. 非加性地加载场景。这将破坏当前场景中的所有对象并自动调用Resources.UnloadUnusedAssets

如果项目具有定义明确的点,用户可以等待对象加载和卸载,例如在游戏模式或级别之间,则应使用这些点来根据需要卸载任意数量的对象并加载新对象。

最简单的方法是将项目的离散块打包到场景中,然后将这些场景及其所有依赖项构建到AssetBundles中。然后,应用程序可以进入“加载”场景,完全卸载包含旧场景的AssetBundle,然后加载包含新场景的AssetBundle。

虽然这是最简单的流程,但有些项目需要更复杂的AssetBundle管理。由于每个项目都不同,因此没有通用的AssetBundle设计模式。

在决定如何将对象分组到AssetBundles时,通常最好先将对象捆绑到AssetBundles中(如果必须同时加载或更新它们)。例如,考虑角色扮演游戏。单个地图和过场动画可以按场景分组到AssetBundles中,但在大多数场景中都需要一些对象。可以构建AssetBundles以提供肖像,游戏内UI以及不同的角色模型和纹理。然后可以将这些后面的对象和资产分组到第二组AssetBundle中,这些AssetBundle在启动时加载并在应用程序的生命周期内保

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值