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

目录

工具Github链接地址

工具功能

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

二、分析AB包冗余情况

三、分析UGUI合批情况


工具Github链接地址

https://github.com/AMikeW/UnityResourceStaticAnalyzeTool

工具功能

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

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

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

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

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

直接搜过滤两个字,删掉这部分即可,tempDict为过滤后的字典,过滤的是 【Unity】静态优化工具支持UGUI合批分析、AB包冗余分析、预制体使用资源情况分析字典,由于较多地方用到,看实际情况修改,上面为其中一个例子。

二、分析AB包冗余情况

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

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

三、分析UGUI合批情况

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

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层级即我们熟悉的渲染顺序层级)

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

【Unity】静态优化工具支持UGUI合批分析、AB包冗余分析、预制体使用资源情况分析
最后,从前到后遍历整个列表,只要出现一个相邻元素贴图、材质、深度不同,合批ID会自增,说明它们不是一个批次的。

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

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相交