当前位置:网站首页>Unity Rebuild和Rebatch浅析
Unity Rebuild和Rebatch浅析
2022-08-11 05:31:00 【canon_卡农】
unity将UI的渲染分为两个步骤,对mesh的操作称为Rebatch,对material和layout的操作称为Rebuild。
先简单说说什么是DrawCall和Batch:
DrawCall
Drawcall,即绘制调用命令
CPU在准备好渲染数据后会通过Drawcall命令通知GPU进行渲染
实际发送绘制指令之前,我们需要设置好所有必须的GPU状态,例如:Mesh数据(顶点位置、顶点法线等顶点数据)、着色器代码、纹理数据、混合设置以及其他的着色器属性等。这些都是在CPU上进行。
Batch
一些设置状态、改变状态的指令再加上一或多个绘制指令构成了我们所说的一次Batch。
通常一个batch 对应一个DrawCall,所谓的DrawCall优化其实就是减少Batch的数量。
可以点击Game窗口的Stats查看Batch的数量:
一、Rebatch
Rebatch发生在C++层面,是指Canvas分析UI节点生成最优批次的过程,节点数量过多会导致算法(贪心策略)耗时较长。对应SetVerticesDirty,当一个canvas中包含的Mesh发生改变时就触发,例如SetActive、transform的改变、 颜色改变、文本内容改变等等,canvas独立处理,互相不影响。消耗在对meshes按照深度和重叠情况排序、共享材质的检测等。
Batch以Canvas为单位,同一个Canvas下的UI元素最终都会被Batch到一个Mesh中。Batch前,UGUI根据UI材质以及渲染顺序重排,在不改变渲染结果的前提下,尽可能将相同材质的UI元素合并在同一个SubMesh中,以减少DC。Batch只在UI元素发生变化时进行,合成的Mesh越大,耗时越大。重建对Canvas下所有ui元素生效,不论是否修改过。
5.2之后底层是多线程的,考虑到现在手机上都是多核,这部分消耗可能会小很多。不过对于复杂的UI,还是多注意一些更好。
合批细节
1.计算每个渲染节点的深度depth
1)按照在Hierarchy节点的顺序,从上向下进行depth分析(深度优先原则);
2)跳过不用渲染的节点,比如active为false,image脚本Disable,Canvas不渲染的Layer等;
3)如果处于渲染状态且(网格)没有覆盖到其他节点,depth = 0;
4)处于渲染状态但是覆盖到其他节点,找到被覆盖节点中depth最大的元素A。
5)若节点的材质和贴图是否和A相同,则节点的depth等于A节点。否则A节点depth + 1;
2.根据节点的depth、材质(获取Instance ID)、贴图(Instance ID)对节点进行排序。
根据排序结果对depth、材质、贴图都相同的节点进行合批。
注意尽量将节点的Z值设为0,特殊情况下Z值不为0会打断合批。
二、Rebuild
Rebuild发生在C#层面,是指UGUI库中layout组件调整RectTransform尺寸、Graphic组件更新Material,以及Mask执行Cull的过程,耗时和发生变化的节点数量基本呈线性相关。
只有LayoutGroup的直接子节点,并且是 Graphic类型的(比如 Image 和 Text)会触发SetLayoutDirty。
Graphic改变的原因包括,基本的大小、旋转以及文字的变化、图片的修改等等,对应SetMaterialDirty。
发生Rebuild时会触发Rebatch。
三、优化点
1.Canvas动静分离,合理划分,按游戏类型和UI数量划分,太多也有额外消耗。
举例:跑马灯效果,可以在动态节点的父节点添加一个单独Canvas。
2.减少节点层次和数量,使用相同材质贴图的UI尽量保持深度相同,减小合批计算量。
举例:可以将一个Text的层级下面放一个其他图集的透明图片,将其层级垫高,使其与相同depth的Text节点进行合批。
3.修改Image的Color属性,原理是修改顶点色,会引起网格Rebatch,同时触发Canvas.SendWillRenderCanvases。
好处在于修改顶点色材质不变,没有额外DC。修改shader颜色不会重绘,材质不变,没有Rebatch。
举例:颜色的渐变效果(颜色动画)可以通过动态修改材质的shader颜色来实现。
4.RectMask2D代替Mask。
5.少用layout,简单的布局RectTransform代替。
6.不显示的对象,不要SetActive,设置Canvas Group的alpha为0,scale为0,这样vbo不会被清除。
或者CanvasRenderer.cull设为true,表示当UI的透明度为0的时候删掉网格和顶点。
总结
不论是Rebatch或者Rebuild都会带来额外性能消耗,应该尽量避免。
这块是UGUI性能的关键,以上都是从网上看来的,有空了一定要去研究下源码实现。
参考:
UGUI DrawCall合批细节
https://edu.uwa4d.com/lesson-detail/126/482/0?isPreview=false
https://zhuanlan.zhihu.com/p/340480771
https://blog.csdn.net/wanttokonw/article/details/121889261
Unity官方的UGUI优化指南读后总结
UGUI深入理解–性能优化总结
NGUI和UGUI对比及性能提升技巧
边栏推荐
- Day 75
- Certificate of SearchGuard configuration
- stack stack
- Building a data ecology for feature engineering - Embrace the open source ecology, OpenMLDB fully opens up the MLOps ecological tool chain
- The official website of OpenMLDB is upgraded, and the mysterious contributor map will take you to advance quickly
- js 学习进阶(事件高级 pink老师教学笔记)
- 第六届蓝帽杯 EscapeShellcode
- He Kaiming's new work ViTDET: target detection field, subverting the concept of layered backbone
- 【无标题】
- Day 68
猜你喜欢
C语言-6月8日-给定一个字符数组‘i am a student’ 统计字符a的个数并进行输出
Scene-driven feature calculation method OpenMLDB, efficient implementation of "calculate first use"
8-byte standard request parsing during USB enumeration
Intelligent risk control China design and fall to the ground
第六届蓝帽杯 EscapeShellcode
js learning advanced (event senior pink teacher teaching notes)
Fourth Paradigm OpenMLDB optimization innovation paper was accepted by VLDB, the top international database association
JVM tuning and finishing
【LeetCode-56】合并区间
Open Source Machine Learning Database OpenMLDB Contributor Program Fully Launched
随机推荐
USB URB
【LeetCode-75】 颜色分类
mk file introduction
JVM tuning and finishing
C语言-7月31日-指针的总结以及typedef关键字
轻松理解进程与线程
Certificate of SearchGuard configuration
【剑指offer系列】面试题日记(前期题)
stack stack
Pinyougou project combat notes
【LeetCod】三数之和-15
Promise.race learning (judging the fastest execution of multiple promise objects)
Fourth Paradigm OpenMLDB optimization innovation paper was accepted by VLDB, the top international database association
127.0.0.1 已拒绝连接
星盟-pwn-babyheap
一文看懂注解与反射
JS事件循环机制
js 学习进阶(Dom部分 pink老师教学笔记)
The whole process of Tinker access --- configuration
Day 82