性能优化(40)——发布优化——打包优化


 

AssetBundle

  • AssetBundle是一个存档文件,包含运行时加载的特定平台的非代码资源,与彼此之间的依赖关系
  • AssetBundle可以用于资源更新,减少安装大小,针对平台加载优化资源,减轻运行时内存压力
  • AssetBundle是一个容器,包含存档文件包头、以及序列化类型文件与资源文件

构建AssetBundle参考策略

  • 根据对象的修改频率差异拆分不同的AssetBundle
  • 具有相同生命周期的资源打成一个AssetBundle,如果一个AB中只有不到50%的资源经常加载,可以考虑拆到不同的AssetBundle中
  • 不可能同时加载的高低配置资源拆分到不同的AssetBundle
  • 如果多个对象依赖于某个AssetBundle中的单个资源,这类单个资源可以单独打包或者根据生命周期将这类被多个对象依赖的资源打成共享AssetBundle
  • 如果一组对象只是一个对象的不同版本,可以考虑使用AB变体(注意Addressable不支持AB变体)

构建AssetBundle值得注意的点

  • AB包体不能因为避免重复引用,拆得过于细碎,2M-5M的包体是一个合理的参考值(移动平台下)。过小的包体,包头占用内存压力会比较大。一些操作系统,如IOS,也会有同时开启多个文件具体的数量限制,很容易就超过系统限制上限了;另外资源加载与销毁,反复创建销毁文件句柄,会造成系统资源开销大,电量消耗也会加大
  • LZMA格式压缩的AB包较小,但需要完全解压后再加载,加载时间更长,LZ4格式压缩的AB包按块加载,加载时间较快,但包体大小较大,移动平台建议使用LZ4压缩格式
  • 如果确定使用相同版本Unity发布打包,后续开发不会升级Unity版本,AB包体不做Unity版本兼容时可以尝试开启打包选项BuildAssetBundleOption.DisableWriteTypeTree选项,这样TypeTree信息不会被打到AB中,可以极大减小包体大小及运行加载时的内存开销
  • 避免同一个资源被打入多个AB中,会增加运行时内存开销,可以使用UPR Assets Checker工具来做检查。某些情况下,Unity创建资源时,会默认引用一些Unity内置资源,打包时不注意的情况下,这份内置资源会被打到多个AB包中。如创建默认粒子时,默认引用Unity内置资源DefaultParticle.png,如果要避免这种情况,可以用自定义资源替换默认引用资源
  • 不要使用AB包文件的MD5值作为更新包依据,因为可能包内资源没有变化的情况下,生成的AB包MD5值也会发生变化,一般可以选择计算包内原始资源的MD5值和路径变化作为AB包变化的依据