目录

工具Github链接地址

工具功能

一、分析预制体静态资源,如贴图、精灵图、图集等使用情况。

二、分析AB包冗余情况

三、分析UGUI合批情况


工具Github链接地址

https://github.com/AMikeW/UnityResourceStaticAnalyzeTool

工具功能

一、分析预制体静态资源,如贴图、精灵图、图集等使用情况。

第一张图表格是预制体的使用资源情况,第二张图是分析预制体的依赖资源具体内容,主要是图片MD5作为key值存于字典中,字典的值为{图集Tag,SpriteAtlas路径,图片路径,预制体路径},标记为红的代表冗余,标记为黄的代表图集冗余,这个表格有过滤处理,如需查看未过滤的情况可修改源码如下位置;

直接搜过滤两个字,删掉这部分即可,tempDict为过滤后的字典,过滤的是 字典,由于较多地方用到,看实际情况修改,上面为其中一个例子。

二、分析AB包冗余情况

原理:加载工程内所有ab包,分析其下的全部资源(支持大多数资源类型),最终会分析出如下表格。

三、分析UGUI合批情况

0/0/0/0 代表 合批ID/深度/材质ID/贴图ID ,其中材质ID和贴图ID都是虚拟ID(被我修改后的,详情看源码)

大致参考https://gameinstitute.qq.com/community/detail/112235

这篇文章并没有给出工具,所以就自己实现了一下,可能有错误还需要优化调整,代码写的很乱,但是都有比较详细的注释。

原理:

按深度优先级顺序遍历Cavnas下的所有UI(可理解为Canvas为根节点),根据如下规则计算深度:

①UI下不存在任何UI时(注意UI下并不是指子UI),深度为0。

②UI下存在UI时,若可以与其下UI合批(材质、贴图相同)且相交,则深度为其下UI深度;若不可以与其下UI合批且相交,则深度为其下UI深度+1;当其下存在多个UI时,逐个计算出depth_1, depth_2, ... 取最大作为自身深度。

以上图为例说明,注意第二个数字就是深度;
1、M其下没有UI,深度为0;
2、A1其下有M,判断出不可与M合批且相交,深度为M深度+1=0+1=1;
3、A2其下有A1、M,判断出可与A1可批且相交,A2&A1_depth为A1深度=1,判断出不可与M合批且相交,A2&M_depth为M深度+1=0+1=1,取max(A2&A1_depth, A2&M_depth)=max(1,1)=1,为A2深度。
4、Text其下有A2、A1、M,同上原理计算出Text&A2_depth=2, Text&A2=2, Text&M=1,取最大为2;(其他情况同理)

每一个UI的深度计算出来后,还需知道它们的材质ID和贴图ID 以及 UI层级,进行如下的排序
1、深度先序
2、材质先序
3、贴图先序
4、层级先序(PS:UI层级即我们熟悉的渲染顺序层级)


最后,从前到后遍历整个列表,只要出现一个相邻元素贴图、材质、深度不同,合批ID会自增,说明它们不是一个批次的。

Mask打断合批的情况:(可选看)

1、 一个Mask自身下的 子UI可以合批, 但不能与Mask外的UI合批。
2、Mask下的所有子UI可合批时,有一个DC,而Mask自身也会生成一个DC(必然会有一个DC)

2、 多个Mask自身不会合批。

测试Unity 2017 4.32f1

(最优先考虑)
1、Mask整体(包括子物体UI) 不与任何UI相交时,
    1.1 Mask自身可与其他Mask自身合批,合批ID必须一样(已确认)
    1.2 Mask下的子UI可与其他Mask下的子UI合批,按照正常合批来考虑,合批ID必须一样(已确认)
    1.3 Mask裁剪图可与其他Mask裁剪图合批,限制条件如下: 
          条件①:Mask图下不能有Text字体网格与子UI图相交(关于字体网格如何计算还未清楚,目前可粗略考虑为RectTransform相交)
          条件②:Mask图不能和Text字体网格与子UI相交(已确认与4同理)
          条件③:Mask图下不能有【不可合批的子UI图片】相交(已确认)
          条件④:Mask图不能和【不可合批的图片】相交。(已确认,即Mask裁剪图的Mask物体们必须合批ID相同)
              限制条件总结为:Mask图及其子UI不能存在不可合批的相交UI情况(UI包括Text、Image等)
       但,只要满足限制条件,Mask裁剪图下的子UI无论是否能合批,裁剪图都会合批;比如:即使子UI下存在不可合批的UI,但只要它们没有相交,那裁剪图就能合批!

2、Mask整体 有与其他UI相交时, (与1相反)
   2.1 Mask自身不能与其他Mask自身合批
   2.2 Mask下的子UI不能与其他Mask下的子UI合批
   2.3 Mask裁剪图不可与其他Mask裁剪图合批(暂未发现其他能合批的情况)

3、默认情况(无论是否相交)
    Mask下的子UI可合批,只要保证材质、贴图相同

总结为
1、Mask自身合批,必须自身合批ID一样(与正常一样 不用管)
2、Mask下子物体合批,也必须是子物体的合批ID一样(与正常一样 不用管)
3、Mask裁剪图合批,必须满足Mask自身可合批,Mask下子物体之间不能合批的不能相交(如图片和字体,不同图集的图片)
    关键3,检查Mask之间自身的合批ID,若不一样标注:Mask裁剪图不可合批,因Mask图不能合批
                检查Mask下的子UI,检查所有子UI,存在不相同合批ID的UI相交时,标注:Mask裁剪图不可合批,因存在不可合批的子UI相交

【Unity】静态优化工具支持UGUI合批分析、AB包冗余分析、预制体使用资源情况分析相关推荐

  1. 【Unity】优化工具Profiler

    Profiler 基本设置和布局 基本设置 基本布局 性能分析器(Profiler)是Unity内部集成的一款性能优化工具,可以检查脚本代码,查看运行过程中资源使用情况,还可以比较不同平台上的性能.但 ...

  2. 实现ip数据包抓取并分析_一些网站https证书出现问题的情况分析

    20200326下午,有消息说[1]github的TLS证书出现了错误告警.证书的结构很奇怪,在其签发者信息中有一个奇怪的email地址:346608453@qq.com.明显是一个伪造的证书. 为了 ...

  3. 【Unity编辑器扩展实践】、查找所有引用该图片的预制体

    上一篇Unity编辑器扩展实践二.通过代码查找所有预制中已经查到到所有的预制体了. 然后我们就可以用这些预制体做一些其他的操作了,比如查找该预制的资源引用.可以直接遍历预制,找到预制里面的所有Imag ...

  4. 算法优化:最大子段和,最大子矩阵和,一维,二维情况分析,动态规划

    最大子段和,前面b[j]理解的是:终点在j的最大连续子段和,及从k:j最大和 是对b[j]进行动态规划,从k:j最大和:取决于k:j-1的最大和,他大于0的话,就为k:j-1的最大和+arr[j],他 ...

  5. unity|加载AB包|有依赖关系的AB包

    进阶,异步加载AB包,请看<异步加载有依赖的AB包> 目录 为什么AB包会有依赖关系呢? 步骤 代码 为什么AB包会有依赖关系呢? 例如导入一个预制体的时候,预制体可能有图片,如果只把这个 ...

  6. Unity性能优化分析思路

    1)Unity性能优化分析思路 ​2)Unity2020后Paticle子节点旋转并把ScalingMode设置为Hierarchy后,对根节点进行缩放时表现不正常 3)FBX默认会冗余lit.mat ...

  7. 威雅[ViYa]QQ优化工具0.64

    威雅[ViYa]QQ优化工具0.64支持简繁英所有版本[01-14更新] 免责声明: 首先使用此工具前,请您确保已经认真详细阅读过腾讯公司和QQ软件以及其他类似软件相关许可协议.使用此工具是您的自愿选 ...

  8. 【小程序源码】llz制作生成装逼工具支持小程序和公众号制作生成

    这是一款制作生成小工具 支持小程序主图制作生成 也支持公众号的llz制作生成 每一种制作都包含了所有的模式 用户自己填写选择制作就可以了! 好了下面来看看小编的测试演示图吧! 小程序源码下载地址:[小 ...

  9. Unity的AB包系统使用概论

    0. 名词表 资源:Resource,主要分为Prefab,Image,AudioClip等,一般在开发时为单个文件 包/ab包:AssetBundle,打包后的单个文件,内含若干资源 包名:Asse ...

最新文章

  1. iOS原生与html交互 使用第三方WebViewJavascriptBridge
  2. 零基础学python需要多久-Python要学习多久能入门?精通需要多久?
  3. Struts(十六):通过CURD来学习Struts流程及ModelDriven的用法
  4. SppNet 多尺度训练
  5. 【计算机组成原理】定点运算器的基本结构
  6. 面试中如何剔除“鱼目混珠”程序员?
  7. Indent Guides for Visual Studio 代码格式化收缩插件
  8. keychron k8 连接切换蓝牙方案
  9. 内存缓存 原理 实现
  10. 中英文对照 —— 音乐
  11. Flutter BuildOwner之dirty elements简析
  12. 无线AP与无线路由器都有些什么区别?(一)
  13. 【python】 turtle实现汉诺塔游戏动画过程
  14. 如何快速在Mac 安装 jq 命令行 JSON 解析器
  15. java好听的名字_(男孩起名)李白诗中最唯美的三字名字推荐,李白诗中最唯美的三字名字取名方法 - Java伴我余生 - 宝宝起名网...
  16. linux IO_FILE 利用
  17. foreach求和的效率和连接mysql的sum求和的效率
  18. Spring boot、Spring cloud深度技术集锦
  19. SSMS SQL格式化插件-SQL Pretty Printer
  20. (附源码)ssm保险办理系统 毕业设计 012232

热门文章

  1. 一群微型四轴飞行器怎么玩
  2. 字符串合并python_Python合并字符串的3种方法
  3. Windows系统下在Anaconda中使用bash
  4. python程序基础网课答案_Python程序设计基础_知到网课答案
  5. Path-Ranking:KBQA中path生成、召回、粗排与精排
  6. 路面检测的多尺度网络结构论文笔记
  7. 解决win10下无法输入反斜杠‘\’问题
  8. 一个方便的内存单位转换工具
  9. docker基本使用
  10. 17 医疗挂号系统_【微信支付】