文档章节

优化AB资源以及内存优化

liyong2
 liyong2
发布于 2016/10/25 00:22
字数 1622
阅读 115
收藏 0

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团队的工作~~

© 著作权归作者所有

上一篇: Actor模式的弊端
下一篇: 留存数据分析
liyong2

liyong2

粉丝 51
博文 196
码字总数 64732
作品 0
广州
程序员
私信 提问
Assetbundle管理与加载

最近在做项目优化的时候发现公司的项目用的还是老式的WWW去加载assetbundle资源的形式,而且是通过在两个Update里面分开加载AB和Asset的,这样虽然避免了协程的的使用,但是把一件事分开成了...

金钟凯
2018/10/29
0
0
unity 内存优化MemoryProfiler

https://bitbucket.org/Unity-Technologies/memoryprofiler Unity5 开源了一个新工具可以用于内存分析。 Unity游戏中内存占用的大头一般是 纹理内存, 使用自带的Profiler 工具可以 查看内存...

李勇2
2016/10/13
145
0
Unity地形切割后打包成AssetsBundle再进行加载的笔记

1.TerrainData文件切割成小块以后,分别打包成单独的AssetsBundle文件,如果不对依赖的资源进行bundleName进行设置,就会出现这部分依赖资源重复打包的问题。单独设置bundleName以后,所有依...

u010133610
2018/05/16
0
0
Voovan 参照 Jetty 的性能测试,中国框架一样很优秀

Voovan是一个综合框架,当然也有他的主打内容,今天,对就是今天,在这里给各位看官汇报一下他的并发测试能力. 测试对象:Voovan WebServer / Jetty9 测试工具: Apache bench (ab) Voovan WebSer...

愚民日记
2017/01/04
1K
2
技术分享连载(五十九)

原文链接:https://blog.uwa4d.com/archives/TechSharing_59.html 我们将从日常技术交流中精选若干个开发相关的问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现...

UWA4D
2017/11/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

spring源码分析6: ApplicationContext的初始化与BeanDefinition的搜集入库

先前几篇都是概念的讲解:回顾下 BeanDefinition 是物料 Bean是成品 BeanFactory是仓库,存储物料与成品 ApplicationContext初始化搜集物料入库,触发生产线,取出物料生产Bean 本文研究spr...

星星之焱
20分钟前
5
0
彻底解决tomcat乱码问题

本地项目请求访问,浏览器中文输出没问题。 部署到服务器上面之后,返回到浏览器的中文就乱码了。 尝试办法: 1.修改tomcat下的conf中的service.xml中的配置信息: 重新启动后,没有效果还是...

诗书易经
35分钟前
5
0
Java开发需要掌握的IDEA插件大全

1、Lombok 解释:这是最基本的插件,2017年就火了,还没用的百度一下吧。 博客链接:Intellij IDEA 安装lombok及使用详解 2、PlantUML integration 解释:各种类之间的关联图,高级开发必备。...

木九天
36分钟前
5
0
python学习10.05:Python range()快速初始化数字列表

实际场景中,经常需要存储一组数字。例如在游戏中,需要跟踪每个角色的位置,还可能需要跟踪玩家的几个最高得分。在数据可视化中,处理的几乎都是由数字(如温度、距离、人口数量、经度和纬度...

太空堡垒185
43分钟前
4
0
java单元测试,PowerMockito模拟方法内new对象

在做单元测试中有时候需要对方法内new出来的对象进行隔离,这是我们需要使用PowerMockito。 添加依赖 <dependency> <groupId>org.powermock</groupId> <artifactId>......

如梦之猿
45分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部