AssetBundle常见的加载方式(2018.4)
AssetBundle.LoadFromFile
AssetBundle.LoadFromFileAsync
AssetBundle.LoadFromMemory
AssetBundle.LoadFromMemoryAsync
AssetBundle.LoadFromStream
AssetBundle.LoadFromStreamAsync
LoadFromFile:
从硬盘的文件中加载一个AssetBundle,如果AB包是LZ4加载方式,它只会加载AB包的Header,之后需要什么资源再加载那部分的AB包chunk。
优点:加载速度快,占用内存小。缺点:加载加密的AB包可能会失败。
LoadFromMemory:
从内存区域创建一个AssetBundle,可以通过byte[]把AB包完整的加载出来。
优点:可以通过byte[]加载加密过的AB包,缺点:内存占用高,会占用两份内存。
LoadFromMemory:
从托管流加载一个AssetBundle,数据是由一个managed Stream对象提供的。
优点:Seek()和Read()可以从任何Unity本地线程调用。 缺点:限制条件较多。
BuildAssetBundleOptions
None = 0: 默认方式。使用LZMA压缩算法,该算法压缩后包体很小,但是加载的时候需要花费很长的时间解压。
备注:第一次解压之后,该包又会使用LZ4压缩算法再次压缩。这就是为什么第一次加载时间长,之后加载时间就没那么长了。
(LZMA需要完整解压之后才能加载包内资源,LZ4不需要完整解压就可以加载包内资源。)
UncompressedAssetBundle = 1: 不压缩。虽然包体大,但是加载快。
CompleteAssets = 4: 强制包含整个资产。
DisableWriteTypeTree = 8: 不包含TypeTree信息。虽然可以使得AB包更小,但是对低版本不兼容。
DeterministicAssetBundle = 16: 创建一个哈希来映射存储在AB包里的对象的id。
ForceRebuildAssetBundle = 32: 强制重建AB包。
IgnoreTypeTreeChanges = 64: 当做增量构建检测时,忽略type tree的变化。
AppendHashToAssetBundleName = 128: 添加哈希到AB包名。
ChunkBasedCompression = 256: 使用基于块的LZ4压缩算法。
StrictMode = 512: 如果在构建时有任何错误,则不允许构建成功。
DryRunBuild = 1024: 干构建。
DisableLoadAssetByFileName = 4069: 禁止AB包通过文件名加载资源。
DisableLoadAssetByFileNameWithExtension = 8192:禁止AB包通过文件扩展名加载资源。
LZMA和LZ4压缩算法的区别
LZMA是流压缩方式(stream-based)。流压缩再处理整个数据块时使用同一个字典,它提供了最大可能的压缩率,但是只支持顺序读取。所以加载AB包时,需要将整个包解压,会造成卡顿和额外内存占用。优点是AB包小。
LZ4是块压缩方式(chunk-based)。块压缩的数据被分为大小相同的块,并被分别压缩。如果需要实时解压随机读取,块压缩是比较好的选择。优点是压缩比高,加载速度快。
项目可以针对本身的需求,制定不同的策略来进行压缩方式的选择。