美文网首页unity AB包
(四)unity加载AssetBundle

(四)unity加载AssetBundle

作者: 对方正在脱发中 | 来源:发表于2020-05-21 12:05 被阅读0次

    一、本地加载AssetBundle而非将包托管第三方的用户,可能将会使用到AssetBundles.LoadFromFile API 。也就是unity建议使用的本地加载API,之前的名字叫 AssetBundle.CreateFromFile,功能是一样的。(除此之外,还有AssetBundle.LoadFromMemoryAsync---unity不建议使用;WWW.LoadFromCacheOrDownload这两种api可供选择)

    1、AssetBundle.LoadFromFile

    是从本地存储中(如硬盘和 SD 卡)加载AssetBundle、高效的API。 

    如果是未压缩或者使用 LZ4 压缩的 表现如下:

    移动设备: API 只会加载 AssetBundle 的 头部数据, 其他的数据保留在磁盘中。当调用加载的方法(也就是 AssetBundle.Load)或者他们的实例 Id 被解引用时才会被按需加载,在这种情况下没有额外的内存开销的。

    Unity 编辑器: 这个 API 会将整个 AssetBundle 加载进内存,就像使用 AssetBundle.LoadFromMemoryAsync那样,而不是按需从磁盘上读取资源。当 AssetBundle 加载时,在Unity编辑的Profiler面板会出现一个峰值,但是在实际设备上面并不会出现,所以如果你要优化这个峰值,需要在实际设备上面重新测试。

    如果是 lzma 压缩,则将数据解压缩到内存。

    2、WWW.LoadFromCacheOrDownload

    对于从远端服务器和本地存储中加载对象来说很有用,可以使用 file:// 链接地址从本地加载文件。如果 AssetBundle 已经在 Unity 的缓存中存在,则它会表现的跟 AssetBundle.LoadFromFile 一样。

    如果 AssetBundle 没有被缓存,WWW.LoadFromCacheOrDownload 会从 AssetBundle 的源地址读取它。如果 AssetBundle 是压缩格式,它会使用一个 worker 线程来解压 AssetBundle 并且写入到缓存当中。如果AssetBundle没有压缩,worker 线程会直接将它写入缓存中。

    一旦 AssetBundle 被缓存了,WWW.LoadFromCacheOrDownload 会从缓存中加载 Header 信息和未压缩的 AssetBundle。之后这个 API 表现就跟 AssetBundle.LoadFromFile 一样了。

    注意: 当数据被解压并写到缓存的同时,WWW 对象会在本地内存中保留一份 AssetBundle 字节的完整拷贝。这个 AssetBundle 的额外的拷贝是用来支持WWW.bytes属性的。

    由于 WWW 对象缓存 AssetBundle 占用空间大,这里推荐开发者使用 WWW.LoadFromCacheOrDownload API的 AssetBundle 保持尽可能小(最多几 M )。也推荐开发者在内存有限平台上,如移动设备,确保他们的代码在同时只有一个 AssetBundle 在下载来避免内存峰值。

    注意: 每调用一次这个 API 都会生成一个新的 worker 线程,要当心多次调用这个 API 的时候多产生多个线程的问题。如果有 5 到 10 个 AssetBundle 需要下载,建议代码只让少数几个 AssetBundle 同时下载。

    二、托管第三方的用户,建议在unity5.2或者更老版本中使用WWW.LoadFromCacheOrDownload,在 Unity 5.3 或更新版本中使用 UnityWebRequest

    UnityWebRequest 有一个特定 API 调用来处理 AssetBundle。首先,需要使用 UnityWebRequest.GetAssetBundle 来创建 Web 请求。返回请求后,请将请求对象传递给 DownloadHandlerAssetBundle.GetContent(UnityWebRequest)。GetContent 调用将返回 AssetBundle 对象。

    下载捆绑包后,还可以在 DownloadHandlerAssetBundle 类上使用 assetBundle 属性,从而以 AssetBundle.LoadFromFile 的效率加载 AssetBundle。

    在 Unity 5.3 的移动平台上,Unity 引入了 UnityWebRequest API,它比 Unity 的 WWW API 更灵活。UnityWebRequest 可以让开发者指定 Unity 怎么样处理数据和避免不必要的内存开销。使用 UnityWebRequest 去下载一个 AssetBundle 的最简单的方式就是调用 UnityWebRequest.GetAssetBundle API。

    END

    一般来说,只要有可能,就应该使用AssetBundle.LoadFromFile。这个API在速度、磁盘使用和运行时内存使用方面是最有效的。

    当使用UnityWebRequest或WWW.LoadFromCacheOrDownload时,要确保下载程序代码在加载AssetBundle后正确地调用Dispose。另外,C#的using语句是确保WWW或UnityWebRequest被安全处理的最方便的方法。

    对于需要独特的、特定的缓存或下载需求的大项目,可以考虑使用自定义的下载器。编写自定义下载程序是一项重要并且复杂的任务,任何自定义的下载程序都应该与AssetBundle.LoadFromFile保持兼容。

    相关文章

      网友评论

        本文标题:(四)unity加载AssetBundle

        本文链接:https://www.haomeiwen.com/subject/gpaaohtx.html