Unity热更新系列之一: bundle打包和打包策略

资源对于手游来说其重要性是不言而喻的,bundle的打包策略最终影响的是资源的加载以及内存,所以要根据项目的实际情况去平衡你的bundle的粒度和大小。对于粒度,因为项目起初用的是Unity5.3.8的版本,官方工程师的说法是每个Assetbundle文件在Load的时候都会产生 0.5MB的内存来序列化bundle文件,直到Unload掉,后面用高版本5.6.6发现并没有这样的内存开销。对于bundle的大小,一方面要避免资源的冗余,一个资源被打进多个bundle中,这样不但会增加包体的大小还造成运行时内存存在多份同一资源,另一方面要避免太多资源被同时打进一个bundle不利于运行时加载。

在说打包bundle前,先说下工程里资源文件夹的目录结构,好的目录结构资源存放可以让你更清晰了解你的工程资源,便于管理,不管是开发初期,还是后期的版本迭代维护都是百利而无一害。而如果资源随意乱放,你会发现越到后面维护起来越麻烦,不但你打bundle时会麻烦,bundle之间依赖也会很多,不利于运行时的bundle加载卸载。整个项目资源是团队共同协作的,所以在项目初期就定好规范是很有必要的。

工程的资源可以分成三大类:       

  1. 无需代码动态加载的原始资源目录AssetsRaw ,比如模型,贴图等 
  2. 要代码动态加载的资源目录ResData,比如预设,音效,配置文件,场景等
  3. 各种插件目录3Party                       

可以根据上面三种类型在Assets目录下创建对应的文件夹再细分到对应下面的各个模块,而对于bundle打包来说其实最关心的是就是第二类型,遍历收集ResData目录下资源的外围依赖资源,再根据自己的打包策略打去打包。

在Editor模式下获取资源依赖的资源接口                                                                                                                                             string[] ds = AssetDatabase.GetDependencies(file);                                                                                                                          ***注意这个ds中可能包含资源文件file本身,处理的时候要注意下

Unity构造bundle资源单位有两种接口,一个是AssetBundleBuild类:

 List<AssetBundleBuild> maps = new List<AssetBundleBuild>();                                                                                                        AssetBundleBuild build = new AssetBundleBuild();
  build.assetBundleName = abName;
  build.assetNames = new string[] { file1, file2 };
  maps.Add(build);

使用这个接口重视的是以bundle为单位,构建一个bundle单位时要确保你已经知道并收集到了哪些资源要放进该bundle中,然后指定它的包名跟这些资源文件就行了

另一个是AssetImporter类:

 AssetImporter importer = AssetImporter.GetAtPath(file);
 importer.assetBundleName = abName;

使用这个接口更重视的是以单个资源文件为单位,指定其包名,而不用在意其它的资源会被指定什么包名被打进哪个bundle,所以用起来更方便。

以上两种方式对应对应以下最终的bundles生成接口

 BuildAssetBundleOptions opt = BuildAssetBundleOptions.ChunkBasedCompression;
 1. BuildPipeline.BuildAssetBundles(outputPath, maps.ToArray(), opt, EditorUserBuildSettings.activeBuildTarget);
 2. BuildPipeline.BuildAssetBundles(outputPath, opt, EditorUserBuildSettings.activeBuildTarget);

对于打包选项BuildAssetBundleOptions选择用LZ4压缩,而不用默认的LZMA。简单说下这两种的区别

LZ4: 相对LZMA压缩比更低,所以打出来的包体会更大点,运行时解压更快而且没有额外的内存消耗,是从磁盘读取                  LZMA:相对LZ4压缩比更高,所以打出来的包体会更小点,运行时解压更慢而且有额外的内存消耗

注意可能遇到的问题:

  1. 有些shader文件会默认依赖某些贴图,如果该贴图打包时被打进的bundle里面有其它资源又依赖该shader所在的bundle,就会出现bundle互相依赖的情况,代码加载bundle的时候就有问题,因为要保证依赖包先加载进内存,所以打包的时候要避免这种情况。  
  2. 引擎不识别.lua和.bin文件,所以即使给这种文件设置了包名也打不出对应的bundle,解决方法是添加.txt后缀
  3. 打完bundle后重启unity再打一次,会出现有些budle不可控的改变了(原资源未变),这种情况比较严重,因为这影响后面做更新包的大小。解决方法是使用增量打包,即保留上次打的bundle目录下.manifest文件                                                   

 

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值