新浪博客

AssetBundleCompression Bundle的压缩格式

2016-12-28 17:54阅读:
Asset Bundle Compression
对于AssetBundleUnity支持三种压缩方式:LZMA ,LZ4,Uncompressed.

LZMA Format
默认情况下,构建Asset Bundles时,它们以压缩格式存储。 标准压缩格式是串行化数据文件的单个LZMA流,并且在使用之前需要将其全部解压缩。

LZMA压缩包给出尽可能小的下载大小,但是具有相对缓慢的解压缩,导致更长的加载时间。

LZ4 Format
Unity还支持LZ4压缩,这会导致更大的压缩文件大小,但不要求在使用之前解压缩整个软件包。LZ4是一种“基于块的”算法,因此当从LZ4压缩包中加载对象时,只有该对象的相应块被解压缩。 这发生在运行中,这意味着不需要等待整个包解压完成。 LZ4格式在Unity 5.3中引入,在以前的版本中不可用。

UnCompressed Format
第三种压缩选项是没有压缩。未压缩的邮件包很大,同样下载后访
问速度最快。

Caching of Compressed Bundles
WWW.LoadFromCacheOrDownload函数将资产包下载并缓存到磁盘,从而大大加快了加载速度。 Unity 5.3开始,缓存的数据也可以用LZ4算法压缩。 与未压缩的软件包相比,这节省了40-60%的空间。 重新压缩在下载期间发生,因此几乎不被最终用户察觉。 当数据从套接字到达时,Unity将解压缩它并以LZ4格式重新压缩它。 这种重新压缩发生在下载流传输期间,这意味着一旦足够的数据被下载就开始缓存压缩,并且继续递增直到下载完成。 之后,通过在需要时通过解压缩块来从高速缓存的束读取数据。

默认情况下启用缓存压缩,并由Caching.compressionEnabled属性控制。 它影响缓存到磁盘并存储在内存中的软件包。

AssetBundle load API
此表提供了使用不同压缩类型和不同加载方法时的内存和性能开销的比较。

Uncompressed
Chunk CompressedLZ4
Stream CompressedLZMA
WWW*
内存:未压缩大小(while WWW is not disposed)
性能:无额外处理
内存:LZ4HC压缩尺寸+(While WWW is not disposed,LZ4HC压缩尺寸)
性能:无额外处理
内存:LZ4压缩包大小+(while WWW is not disposed,LZMA压缩包大小)
性能:LZMA解压 + 下载期间LZ4的压缩性能
LoadFromCacheOrDownload
内存:不使用额外的内存
性能:从磁盘读取
内存:不占用额外的内存
性能:从磁盘读取
内存:不占用额外的内存,
性能:从磁盘读取
LoadFromMemory(async)
内存:未压缩的Bundle包大小
性能:无额外处理
内存:LZ4HC压缩包大小。
性能:无额外处理
内存:LZ4压缩包大小,
性能:LZMA解压+LZ4压缩
LoadFromFile(Async)
内存:不占用额外的内存。
性能:从磁盘读取
内存:不占用额外的内存。
性能:从磁盘读取
内存:LZ4压缩包大小。
性能:从磁盘读取+LZMA 解压+LZ4压缩。
WebRequest(also supports caching)
内存:未压缩的Bundle大小。
性能:没有额外的处理开销【+如果缓存从磁盘读取】
内存:LZ4HC压缩包大小。性能:没有额外的处理[+如果缓存从磁盘读取]
内存:LZ4压缩包大小。性能:LZMA解压缩+ LZ4压缩下载期间[+如果缓存从磁盘读取]

Tips:当使用WWW下载包时,WebRequest还有一个8*64KB 的累加器缓存区,用于存储来自套接字的数据。

因此,当在游戏中使用LoadingAPI时,请遵循以下准则:
1. 将资源包与你的游戏一起部署为SteramingAssets,在构建包时使用BuildAssetBundleOPtionsChunkBasedCompression.并在加载它时使用AssetBundle.LoadFromFileAsync.这提供了内存压缩和最快的加载性能,内存开销等于读缓冲区。
2. 将资产包下载为DLC - 使用默认构建选项(LZMA压缩)和LoadFromCacheOrDownload / WebRequest下载并缓存它。在这里,您将获得最佳的压缩率和AssetBundle.LoadFromFile加载进一步加载的性能。
加密的bundle - 选择BuildAssetBundleOptions.ChunkBasedCompression,并使用LoadFromMemoryAsync加载(这是几乎是唯一的情况,应使用LoadFromMemory [Async])。
3. 自定义压缩 - 使用BuildAssetBundleOptions.UncompressedAssetBundle构建和AssetBundle.LoadFromFileAsync在加载自定义压缩算法解压后的bundle
您通常应该总是选择异步函数 - 它们不会停止主线程,并且它们允许加载操作更有效地排队。并且绝对避免同时调用同步和异步函数 - 这可能在主线程上引起卡顿。

AssetBundle 格式已更改,以支持新的压缩类型,并为进一步改进提供依据。Unity5仍然支持在Unity4中创建的Bundle,但是不支持在早期版本中创建的Bundle

我的更多文章

下载客户端阅读体验更佳

APP专享