目录
工具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相交