赞
踩
资源对于手游来说其重要性是不言而喻的,bundle的打包策略最终影响的是资源的加载以及内存,所以要根据项目的实际情况去平衡你的bundle的粒度和大小。对于粒度,因为项目起初用的是Unity5.3.8的版本,官方工程师的说法是每个Assetbundle文件在Load的时候都会产生 0.5MB的内存来序列化bundle文件,直到Unload掉,后面用高版本5.6.6发现并没有这样的内存开销。对于bundle的大小,一方面要避免资源的冗余,一个资源被打进多个bundle中,这样不但会增加包体的大小还造成运行时内存存在多份同一资源,另一方面要避免太多资源被同时打进一个bundle不利于运行时加载。
在说打包bundle前,先说下工程里资源文件夹的目录结构,好的目录结构资源存放可以让你更清晰了解你的工程资源,便于管理,不管是开发初期,还是后期的版本迭代维护都是百利而无一害。而如果资源随意乱放,你会发现越到后面维护起来越麻烦,不但你打bundle时会麻烦,bundle之间依赖也会很多,不利于运行时的bundle加载卸载。整个项目资源是团队共同协作的,所以在项目初期就定好规范是很有必要的。
工程的资源可以分成三大类:
可以根据上面三种类型在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压缩比更高,所以打出来的包体会更小点,运行时解压更慢而且有额外的内存消耗
注意可能遇到的问题:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。