1:目标android
2:检查ios
3:迭代优化编辑器
4:额外收益工具
5:结合unity Profiler优化内存占用字体
6:总结优化
1:目标 优化AB,一方面下降了AB的大小,下降了包体大小,另一方面ab加载时所占用的内存也会减少,下降了游戏内存不足崩溃的几率。动画
同时经过对AB中包含资源的深刻分析,能够避免将一些旧的资源错误打入到ab中。ui
2:检查指针
2.1: Unity4.x的ab打包是手动管理依赖,很是麻烦,而Unity5.x自动管理AB之间的依赖,大大下降了开发负担。 手动管理有点相似于c语言直接用指针,控制性强,可是极其容易出错;而自动管理依赖,会致使对ab资源打包原理的缺乏分析和关注,使得对ab的优化不够。对象
打包的基本策略: 将公共依赖的资源打入到一个公共ab中,其它ab依赖于公共ab。
咱们使用的是Unity5.x, Unity5.x中打包AB有两种方式,一种是直接在编辑器中为每一个资源设置其所属于的ab的名字; 另一种方式是在代码中,设置每一个ab包含哪些资源路径,咱们采用的是第二种方式,在代码中指定。
2.2:咱们游戏作了若干次AB的检测,逐步优化掉了一些AB打包中的问题:
UWA中的ab资源检测界面,主要分为两个栏目: 一个是以AB为观察对象,另一个是以 资源自己为观察对象;
第一次检测的结果,能够看到不少ab中有冗余的资源。
能够看资源使用栏目,查看哪些资源冗余了,通常都是些shader,材质,纹理,sprite,动画,之类的资源冗余。
点击资源使用,看到资源冗余的状况。
看到有大量的sprite冗余,由于咱们游戏每一个UI打入到了一个独立的ab中,而UI公共使用的一些sprite没有打入到公共ab中,致使这些sprite被打入到了每一个UI ab中, 而sprite对应的纹理,也被打入到了这些ui的ab中。
解决方案就是,额外加一个公共ab,将这些sprit打入到这个ab中。使UI ab依赖于这个公共ab。
材质的冗余主要是,废弃掉的粒子效果仍然被打入到了ab中,删除掉这些粒子效果。
动画冗余,忘记将ui动画打到公共ab中了,把动画目录添加到公共ab。
Shader冗余,每一个材质被单独打到独立的ab中了,致使材质用的shader被重复打入,这里以前有个误区,将shader放到一个prefab中,将prefab打入到公共ab中,并不能使这些材质ab 依赖于这个公共ab, unity5.x中 ab之间的依赖必须是显式的,而不能是隐式的, 必须显式的将 shader的路径加入到公共ab中,才能使材质ab依赖于公共ab。
Font冗余,错误的使用了一个旧的字体,调整全部使用旧字体的ui。
Mesh冗余,模型打ab的时候,忘记处理了。
3迭代优化,验证 发现了这些冗余资源,新增一个公共ab,将冗余资源所有打入其中,运行时,首先加载这个公共ab里面全部的资源。
最后优化的结果:
剩下两个Sprite是错误引用了Unity本身的资源,能够调整相关UI去掉对应的应用。
Texture2d中,2个是上面错误的sprite使用对应的纹理;一个是角色模型的材质中引用到的纹理,没有打入到公共ab中;
还有3个比较特殊,这三个纹理对应的sprite已经打入到公共ab中了,可是在UI中,是以rawImage的方式引用到这几个sprite,rawImage引用的sprite,都至关于直接引用纹理,而不是sprite,致使不能使用公共ab,修正方法额外复制一份这些sprite,设置其importe typ为texture,将这些texture2d打入到公共ab中。
旧的字体的材质和字体自己这两个已经删除了,上图的这个结果是我没删除以前的。
Mesh模型,能够将其打入到公共ab中便可。
能够看到要彻底优化掉这些冗余资源,还须要对现有的UI等作一些修改,因此ab优化不仅仅是只优化打包流程就能够的哦。
4:额外收益 经过查看每一个ab中包含哪些资源能够发现一些问题
4.1:首先是咱们的sprite居然都没有打包成sprite atlas,
能够看到,ui纹理都是一张张碎图,究其缘由,一是 sprite没有设置packingtag,二是 sprite都放在resources目录下面,致使打包ab的时候,resources目录下的sprite是不会生成图集的,unity的坑,所以调整一下打包代码,打包的时候将这些sprite移动到resources外面某个目录中, 打包ab结束,再放回去。
正常的结果,能够看到texture2d的名字都叫作 spriteatlas 了。
4.2:发现一些旧的sprite也被打包进了ab中,利用uwa的功能,很是容易找到全部引用到旧资源的UI,在unity中调整,去掉对旧资源的引用。
5:结合unity Profiler优化内存占用 ab的冗余去除掉了,可是优化尚未结束,编译一个development的程序,设置链接到Profiler。 在Profiler中查看内存的使用状况: 能够看到纹理内存占用大大下降了。
以前50-60MB, 优化后,20-30MB。
接着作一次内存采样,看一些每一个纹理的内存大小:
能够看到有些图特别大,是由于没有设置为压缩格式致使的,ios是pvrtc, android是 etc1格式。 设置为压缩格式品质会有一些下降,可是内存和加载速度会优化。
6:总结 总之,使用UWA的ab分析工具,能够很是直观的看到全部的ab以及资源的状态,很是利于咱们进行资源的分析和优化~ 感谢UWA团队的工做~~