Unity性能优化二
一:合批
合批其实就是将UI Mesh能够合并在一起的进行合批
合批规则:首先通过几个判断条件进行判断合批 Depth(优先级最高通过它来进行 UI 的排序 ,depth=-1 Setactive=false 不渲染,然后看该元素下面有没有其他元素就是有没有覆盖在其他元素上面没有就是 0 ,如果在它上面继续有覆盖深度值就继续加 1 ,这就是深度计算规则,数字越小越先渲染 ) , Mat_ID , Texture_ID, Render_Order( 面板中的摆放顺序 ) , Depth 是自动计算的。先通过 depth 值计算出所有 UI 的深度 UI 数组,在计算深度值的时候会进行元素间的是否合批测试来定深度值,然后判断当前深度值的 UI 的 Texture_ID , Mat_ID 是否相同,最后判断 Render_Order ,相同则保存在合批数组中,最后传入批处理操作方法处理判断相邻元素是否能进行批次号的处理。另外中间层的打断合批,所以在 UI 布局的时候也是有讲究的
Mesh覆盖 Text 覆盖打断相邻元素 ( 指的是同批次号的相邻元素 ) 合批
合批处理查看工具 Profiler UI模块 FrameDebug
注意:能不能合批是根据计算后的排序合批数组来判断的,然后相邻元素能否合批才是决定最后能否合批的结果跟前面计算UI 的计算深度数组和场景中 UI 顺序无关
Mask与 RectMask2D 的实现区别
为什么在Unity中经常说到不要使用 Mask 组件?
Mask 实现遮罩方法 GetModifiedMaterial 主要使用模板缓存的方式实现,模板缓存主要是 Shader 方面的知识不多做介绍
Mask 不能与其他元素进行合批处理,会打断合批,在 Mask.GetModifiedMaterial 方法中会添加一个基本材质 , 那这样 Mat_Id 就与其他元素的 Mat_Id 不一样从而打断合批
Mask 之间是可以进行合批的,因为 Mask 所添加的材质是一样的 Texture_Id 和 Mat_Id 都是一样的
Mask 有两次 Drawcall
Mask里面隐藏的元素仍然占用着 Drawcall
Mask 里面子物体可以进行合批,不同 MasK 中的子物体可以和另一个 Mask 中的子物体进行合批 , 不同 Mask 也可以之间也是可以进行合批的
RectMask2D 用于 2D 遮罩 , 遮罩功能来源于IClipper(裁剪接口 ) 接口
RectMask2D 不占用Drawcall
RectMask2D 裁剪部分不绘制顶点
RectMask2D 裁剪的部分不参与深度运算,但是和其他的 RectMask2D 是无法进行合批的,而自己的子物体是可以进行合批的
*Mask 适用与多个 Mask 同时使用性能高 ,RectMask2D 适合单个适用性能高
优化问题举例
1:透明大背景,透明按钮 , 漏空图片,不规则图片
2: Shadow OutLine 组件
解决方案
1:规则图片可以使用九宫格图片 , 减少填充率
2:不规则图片 使用脚本 PolygonImage
3:透明按钮 使用脚本 Empty4Raycast
4:使用 MeshPro 比 Shadow Outline 会性能高很多
5:使用全屏 UI 时关闭 3D 相机
6: Image 的平铺方式会增加顶点数使用 RawImage 解决
7: RaycastTarget 的勾选,最好做成每次新建 UI 自动勾选掉
8: UI 的动静分离,布局时动静分离,运行时添加 Canvas
9: UI 需要动态修改颜色使用材质代替修改
10:单个 UI 的显示隐藏可使用 CanvasRender.cull, 消耗小 , 一组 UI 可以使用 CanvasGroup.alpha, 不会造成额外的性能消耗
11: Text.BestFit 自动适配大小不要用,因为每适配一次都是一次字体图集的产生
12:打断合批的操作 Position.z Rotation( 只有 180 度可以进行合批 ), 可以使用调整布局的方式优化 , 另外在代码自动添加 UI 可以进行初始化