跳转至

AssetBundle

指 Unity 资源文件打包后的集合

作用

根据需要可以将游戏内的资源打包成 AssetBundle 文件,可以通过Unity提供的API来对加载和卸载,这样可以减少内存消耗,无需加载所有资源文件。

压缩

默认情况下,Unity 通过 LZMA 压缩来创建 AssetBundle,然后通过 LZ4 压缩将其缓存。1

LZMA

压缩率高,适合网络传输,但读取其中某个资源需要将整个文件解压。

LZ4

基于块的压缩算法,压缩率较 LZMA 低,但可以在特定块读取资源,是 AssetBundle 缓存中用的算法。

打包 AssetBundle 时强制开启 LZ4 使用 BuildAssetBundleOptions.UncompressedAssetBundle,如:

[MenuItem("Build Asset Bundles/Uncompressed")]
static void BuildABsUncompressed()
{
    BuildPipeline.BuildAssetBundles("Assets/MyAssetBuilds", BuildAssetBundleOptions.UncompressedAssetBundle, BuildTarget.StandaloneOSX);
}

缓存

加载的 AssetBundle 以两种方式缓存:内存、硬盘

存储在内存中读取非常快,但会占用大量内存,硬盘则相反。除非需要读取非常频繁,一般都使用硬盘缓存。

可以通过设置 Caching.compressionEnabled 来选择是否开启缓存压缩,默认开启,使用 LZ4 压缩。

AssetBundle.LoadFromFileAssetBundle.LoadFromFileAsync 会使用内存缓存,因此应该使用 UWR(UnityWebRequest) API。

如果无法使用 UWR API,可以使用 AssetBundle.RecompressAssetBundleAsync 将 LZMA AssetBundle 重新写入硬盘中。

注意

WebGL 不支持 LZMA 压缩