Unity中Assetbunlde打包方式
1. AssetBundle原理
AssetBundle是Unity中的一种资源包,可以在运行时动态加载实现资源更新的功能
使用AssetBundle可以解决的问题是:
1.1 实现资源的热更。
1.2 减少初始包体大小,资源分包处理。
1.3 可以利用二进制文件做资源加密。
2. AssetBundle压缩
AssetBundle压缩主要为 lzma和lz4的压缩以及不压缩,对应代码为:
BuildAssetBundleOptions.None:使用LZMA算法压缩,压缩的包更小,但是加载时间更长。使用之前需要整体解压。一旦被解压,这个包会使用LZ4重新压缩。使用资源的时候不需要整体解压。在下载的时候可以使用LZMA算法,一旦它被下载了之后,它会使用LZ4算法保存到本地上。
BuildAssetBundleOptions.UncompressedAssetBundle:不压缩,包大,加载快
BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4压缩,压缩率没有LZMA高,但是我们可以加载指定资源而不用解压全部。
注意使用LZ4压缩,可以获得可以跟不压缩想媲美的加载速度,而且比不压缩文件要小。
2.1 文件大小和下载速度。lzma的压缩大小比lz4小,所以下载的速度lzma也比lz4的速度要快。
2.2 加载开销。运行时加载开销lz4要优于lzma不少。
2.3 加载时内存占用。在使用LoadFromFile(Async)加载lzma格式的AB包时,内存的占用会是资源文件内存的大约2倍,而使用lz4则是跟资源文件内存大小一致的。
总结是lz4无论是解压时间、加载开销和内存占用都优于lzma,但唯一的缺点就是包体会大不少(约25%)左右。所以如果想要包体小,且加载速度又快,我们可以使用GZip把资源在打包完之后再打个压缩包,这样的话包体也会小很多。
3. AssetBundle加载
AssetBundle加载有 WWW,AssetBundle.LoadFromFile等方式
3.1 WWW 其优点是即可网络加载又可加载本地,而其缺点是这种方式加载资源,所占的内存要比LoadFromFiles高,相比LoadFromFile加载速度也会要慢一些。
3.2 AssetBundle.LoadFromFiles是目前版本最推荐的加载本地AssetBundle的方式,从性能上目前是最好的,内存占用相比new www也要小。(本地加载www没有可比性)
推荐大家使用WWW来下载更新AB包,下载然后解压到本地后再通过LoadFromFile来加载,这样的做法又快又高效,资源还小。
4. AssetBundle卸载
AssetBundle卸载对应API:AssetBundle.Unload
参数为false时,bundle内的序列化数据将被释放,但是任何从这个bundle中实例化的物体都将完好,所以不能从这个bundle中加载更多物体
2.参数为true时,所有从该bundle中加载的物体也将被销毁,如果场景中有物体引用该资源,引用会丢失
5. AssetBundle依赖关系和打包策略
unity5以后通过API 可以自动处理依赖关系,打包前根据AssetBundles-Browser等工具组织资源引用即可
5.1 对于需要打AB的资源,通过加标签的方式添加到打包列表中。
5.2 合理规划AssetBundle包,公共的资源单独抽离打包。
5.3 注意资源与AssetBundle的关系,一个AssetBundle可以包含多个资源,但同一份资源不允许存在于多个AssetBundle中。
5.4 打包可以按场景或者功能模块分组,也可以按照资源类型和逻辑进行分组,也可根据项目实际情况。