优化AB资源以及内存优化
< 返回列表时间: 2016-10-25来源:OSCHINA
1:目标
2:检查
3:迭代优化
4:额外收益
5:结合unity Profiler优化内存占用
6:总结
1:目标 优化AB,一方面降低了AB的大小,降低了包体大小,另外一方面ab加载时所占用的内存也会减小,降低了游戏内存不足崩溃的概率。
同时通过对AB中包含资源的深入分析,可以避免将一些旧的资源错误打入到ab中。
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团队的工作~~
热门排行