目录

1、目标
2、检查
3、迭代优化
4、额外收益
5、结合unity Profiler优化内存占用
6、总结


一、目标

优化AssetBundle(下文简称AB),一方面降低了AB的大小、包体大小,另外一方面也能减小AB加载时所占用的内存,从而降低游戏因内存不足崩溃的概率。同时通过对AB中包含资源的深入分析,可以避免将一些旧的资源错误打入到AB中。

二、检查

1.Unity 4.x的AB打包是手动管理依赖,非常麻烦,而Unity 5.x自动管理AB之间的依赖,大大降低了开发负担。手动管理有点类似于C语言直接用指针,控制性强,但是极其容易出错;而自动管理依赖,会导致对AB资源打包原理的缺少分析和关注,使得对AB的优化不够。

打包的基本策略:将公共依赖的资源打入到一个公共AB中,其它AB依赖于公共AB。

我们使用的是Unity 5.x, Unity 5.x中打包AB有两种方式:一种是直接在编辑器中为每个资源设置其所属于AB的名字; 另外一种方式是在代码中,设置每个AB包含哪些资源路径。我们采用的是第二种方式,即在代码中指定。

2.我们在UWA(www.uwa4d.com)上提交了若干次资源检测,逐步优化掉了一些AB打包中的问题。下图就是我们多次测试的记录:


UWA中的AB资源检测界面,主要分为两个栏目:一个是以AB为观察对象,另外一个是以 资源本身为观察对象。

第一次检测的结果,可以看到很多AB中有冗余的资源。点击“资源使用”栏目,可以查看哪些资源冗余了,一般都是些Shader,材质,纹理,Sprite,动画之类的资源冗余。

如下图,我们还能看到资源冗余的具体情况:

在此,我们看到有大量的Sprite冗余,因为我们游戏的每个UI都单独打了一个AB包,而UI公共使用的一些Sprite没有打入到公共AB中,导致这些Sprite被打入到了每个UI AB中, 而Sprite对应的纹理,也被打入到了这些UI的AB中。解决方案:额外加一个公共AB,将这些Sprite打入到这个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的时候,忘记处理导致。

三、迭代优化,验证

发现了这些冗余资源,新增一个公共AB,将冗余资源全部打入其中。运行时,首先加载这个公共AB里面所有的资源。

最后的优化结果:

剩下两个Sprite是错误引用了Unity自己的资源,可以调整相关UI去掉对应的应用。

Texture2D中,一个是上面错误的Sprite使用对应的纹理;一个是角色模型的材质中引用到的纹理,没有打入到公共AB中;还有三个比较特殊,这三个纹理对应的Sprite已经打入到公共AB中了,但是在UI中,是以RawImage的方式引用到这几个Sprite。RawImage引用的Sprite,都相当于直接引用纹理,而不是sprite,导致不能使用公共AB,修正方法额外复制一份这些sprite,设置其importe typ为texture,将这些Texture2d打入到公共AB中。

Mesh模型,可以将其打入到公共AB中即可。

可以看到要完全优化掉这些冗余资源,还需要对现有的UI等做一些修改,所以AB优化不单单是只优化打包流程就可以的哦。

四、额外的收获

通过查看每个AB中包含哪些资源可以发现一些问题。

1.首先是我们的Sprite竟然都没有打包成Sprite atlas。

可以看到,UI纹理都是一张张碎图。究其原因,一是Sprite没有设置packingtag,二是 Sprite都放在Resources目录下面,导致打包AB的时候,Resources目录下的Sprite是不会生成图集的。因此调整一下打包代码,打包的时候将这些Sprite移动到resources外面某个目录中,打包AB结束再放回去。

如上就是正常的结果,可以看到texture2d的名字都叫做spriteatlas 了。

2.发现一些旧的Sprite也被打包进了AB中,利用UWA工具,非常容易找到所有引用到旧资源的UI,在Unity中调整,去掉对旧资源的引用。

五、结合Unity Profiler优化内存的占用

AB的冗余去除掉了,但是优化还没有结束。编译一个Development的程序,设置连接到Profiler。在Profiler中查看内存的使用情况如下,可以看到纹理内存占用大大降低了。

之前50-60MB, 优化后20-30MB。接着做一次内存采样,看一下每个纹理的内存大小:

可以看到有些图特别大,是因为没有设置为压缩格式导致的,iOS是PVRTC, Android是 ETC1格式。设置为压缩格式品质会有一些降低,但是内存和加载速度会优化。

六、总结

总之,使用UWA的资源检测与分析工具,可以非常直观地看到所有的AssetBundle以及资源的状态,帮助我们进行更高效的资源分析和优化。

原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

听说你的项目中仅这些资源就卡成了翔?看看他们怎么做!相关推荐

  1. Spring-Boot:写出来的网站访问不到静态资源?怎样通过url访问SpringBoot项目中的静态资源?localhost:8989/favicon.ico访问不了工程中的图标资源?

    Spring-Boot:Spring-Boot写出来的网站访问不到静态资源?怎样通过url访问SpringBoot项目中的静态资源?localhost:8989/favicon.ico访问不了工程中的 ...

  2. 这一次,吃透你项目中的每个资源!

    快速提交 自动检测 开发者只需要按照网站上的提示操作,创建AssetBundle资源文件并上传,即可进行资源检测.整个检测过程全自动进行,文件一旦上传,即刻进行检测和分析.开发者可在30分钟之内收到详 ...

  3. Vue项目中的静态资源引入

    Vue项目中的静态资源引入 assets和static assets 静态资源访问static assets和static assets assets在src文件夹下面,src里面的文件是参与打包的, ...

  4. 驱动、MFC项目改名、代码移植技巧,复制别人项目中的界面资源以及合并项目

    驱动.MFC项目改名.代码移植技巧,复制别人项目中的界面资源以及合并项目 驱动.MFC项目改名.代码移植技巧 复制别人项目中的界面资源 还有一种方法 双击项目中的*.rc文件,打开vs后无反应,无法打 ...

  5. java web资源目录下_Java Web项目中的各种资源的路径写法

    如图,在项目中要跳转到如下的路径中(在项目下的target.html): public class PathDemo extends HttpServlet { public void doGet(H ...

  6. react项目中把获取的url转换成二维码

    在项目开发中遇到一个需求就是把后台返回的URL路径转换成二维码,经过像度娘查询之后选用了一种方法,并且已经在项目中成功使用,所以专门来记录下,避免以后忘记,处理步骤如下: 安装该依赖的来源:https ...

  7. 清理项目中的无用资源

    项目团队合作中,总会出现一些重复或者无用的资源,特别是经过几次迭代.代码不清爽. 以下步骤请依次执行: 多余的import 在项目文件目录右键->Optimize import. 点击Run. ...

  8. [spring]maven项目中获取resources资源目录路径

    项目的资源目录路径如下: package com.zzj.spring.boot.util; import java.io.*; import java.util.Properties; public ...

  9. unity 清理项目中的多余资源

    这里我推荐两个工具 Top1:UnityAssetCleaner Top2:ResourceChecker Top1:UnityAssetCleaner 功能:查看或清理场景/引擎中未使用到的资源,同 ...

最新文章

  1. Oracle集合操作
  2. 今年期末微积分考试试题:看看你能够在两个小时内做对几道题?
  3. 信息学奥赛一本通C++语言——1062:最高的分数
  4. 精彩十年(4)——缔造神话
  5. ubuntu16.04安装中文输入法
  6. ad6怎么画电阻_光敏电阻传感器的使用
  7. 如何利用数字化工具提高工作效率?
  8. tumblr_如何在您的Tumblr博客中添加论坛
  9. 前段时间的世界互联网大会
  10. Ubuntu安装拼音输入法
  11. spring源码构建时缺失spring-cglib-repack-3.2.4.jar和spring-objenesis-repack-2.4.jar
  12. 小度、天猫精灵、华为哪款智能音箱值得推荐?
  13. HUD1873看病要排队
  14. 我自己对英语学习的心得与体会
  15. 针对腾讯云服务器 外网不能访问的问题
  16. 来了老弟,表格的渲染
  17. 如果介绍自己做的项目
  18. UG导出CAD图纸的方法
  19. mysql 密码 enc_配置文件的属性ENC加密
  20. 2015-03-29-绘图和可视化(3)-绘制地图:图形化显示海地地震危机数据

热门文章

  1. 面试心得与总结—BAT、网易、蘑菇街
  2. matplotlib-绘制精美的图表
  3. opencv 中 快速傅里叶变换 FFT
  4. 用Maven构建Mahout项目
  5. 闭包漫谈(从抽象代数及函数式编程角度)
  6. 对线性回归,logistic回归和一般回归的认识
  7. 《大话数据结构》第9章 排序 9.9 快速排序(上)
  8. Redis命令——发布订阅
  9. Mac zsh切换bash bash切换zsh
  10. 《Arduino开发实战指南:LabVIEW卷》——3.2 LabVIEW的数据流编程方法