版本:Unity 6 (6000.0)
语言简体中文
  • C#

AssetBundle.LoadFromStreamAsync

提出更改

成功!

感谢您帮助我们改善 Unity 文档的质量。尽管我们无法接受所有反馈,但我们确实会阅读来自用户的每条变更建议,并在适用时进行更新。

关闭

提交失败

由于某些原因,您建议的更改无法提交。请在几分钟后<a>重试</a>。感谢您抽出时间帮助我们改善 Unity 文档的质量。

关闭

取消

声明

public static AssetBundleCreateRequest LoadFromStreamAsync(Stream stream);

声明

public static AssetBundleCreateRequest LoadFromStreamAsync(Stream stream, uint crc);

声明

public static AssetBundleCreateRequest LoadFromStreamAsync(Stream stream, uint crc, uint managedReadBufferSize);

参数

stream 托管 Stream 对象。Unity 调用此对象上的 Read()、Seek() 和 Length 属性以加载 AssetBundle 数据。
crc 未压缩内容的可选 CRC-32 校验和。
managedReadBufferSize 您可以使用此选项覆盖 Unity 在加载数据时使用的读取缓冲区的大小。默认大小为 32KB。

返回值

AssetBundleCreateRequest 用于 AssetBundle 的异步加载请求。在加载 AssetBundle 后,使用 assetBundle 属性获取 AssetBundle。

描述

从托管 Stream 异步加载 AssetBundle。

该函数支持任何压缩类型的包。lzma 压缩数据将解压到内存中,而未压缩和块压缩包将直接从流中读取。

LoadFromStream 不同,此函数是异步的。

LoadFromFileAsync 不同,AssetBundle 的数据由托管 Stream 对象提供。

以下是对 Stream 对象的限制,以优化 AssetBundle 数据加载

  1. AssetBundle 数据必须从流位置 0 开始。
  2. 在加载 AssetBundle 数据之前,Unity 会将读取位置设置为 0。
  3. Unity 假设流中的读取位置不会被任何其他进程更改。这允许 Unity 进程在每次读取前无需调用 Seek() 就从流中读取。
  4. stream.CanRead 必须返回 true。
  5. stream.CanSeek 必须返回 true。
  6. 它必须可以被不同于主线程的线程访问。可以从任何 Unity 原生线程调用 Seek() 和 Read()。
  7. 在某些情况下,Unity 会尝试读取超过 AssetBundle 数据大小的数据。流实现必须优雅地处理此问题,不会引发异常。流实现还必须返回实际读取的字节数(不包括超过 AssetBundle 数据末尾的任何字节)。
  8. 从 AssetBundle 数据的末尾开始尝试读取数据时,流实现必须返回 0 个读取的字节,且不会引发异常。

为了减少从原生代码到托管代码的调用次数,使用缓冲读取器从流读取数据,该读取器的缓冲区大小为 managedReadBufferSize

  • 更改 managedReadBufferSize 可能会改变加载性能,尤其是在移动设备上。
  • managedReadBufferSize 的最佳值因项目而异,甚至可能因 Asset Bundle 而异。
  • 可以尝试的值范围:8KB、16KB、32KB、64KB、128KB。
  • 对于压缩的 Asset Bundle 或 Asset Bundle 包含大尺寸资产,或者 Asset Bundle 不包含许多资产且它们按顺序从 Asset Bundle 中加载,较大的值可能更好。
  • 对于未压缩的 Asset Bundle 或读取大量小资产,或 Asset Bundle 中包含大量资产并且资产以随机顺序加载,较小的值可能更好。

在加载 AssetBundle 或捆绑包中的任何资产时,不要释放流对象。它的生命周期应该比 AssetBundle 长。这意味着在调用 AssetBundle.Unload 之后释放流对象。

其他资源: AssetBundleLoadFromStream LoadFromFileAsync