-
DrawCall
- Draw Call就是CPU将需要渲染的物体传给GPU让其渲染的过程
- 首先unity引擎会先进行可见性测试,确定摄像机可以看到的物体
- 开始准备物体的数据。将1中获取到的物体的顶点(本地位置,法线,UV等),索引(顶点如何组成三角形),变换(物体的位置,缩放,旋转以及摄像机位置),相关的光源和纹理,渲染方式(由材质/Shader决定)整理好
- 通知图形API开始绘制,将准备好的数据发送至GPU
-
深度测试
- 颜色缓存区
- 深度缓存区
-
渲染队列
- 分层
-
Over Draw
- GPU对同一片区域的重复绘制次数,减少UI控件与控件之间的重叠次数
-
渲染概念 透明物体的渲染
- 透明物体不会写入渲染深度,无法判断物体的先后
- 深度测试的作用,剔除优化作用,有深度可以从前向后渲染
- 半透明物体,从后向前渲染,造成overdraw(填充率),过度绘制
- 少用粒子特效,避免
- UI带有aplha混合,是从后向前的绘制,在Unity中Hierarchy从上到下绘制
-
网格重建
- Rebatch(canvas合批,只要Canvas发生变化,canvas下的元素都会重建)
- Rebuild(单个UI重建) Graphic
-
UI射线
- Raycast Graphic
-
UGUI合批规则
-
概念:同一Canvas下,能够合并Mesh的部分合在一起
-
规则:
- Depth计算规则
- Depth越小,越先渲染
- Material ID
- Texture ID
- RenderOrder(在Hierarchy的顺序)
- 材质和贴图相同的相邻UI元素(1、2、3, 如果只有UI元素2的材质和贴图不同,则也不能合批)
- Depth计算规则
-
合批过程
- 遍历Canvas下的所有元素
- 按照Depth、MaterialID、TextureID、RenderOrder进行排序
- 获得所有元素的排序数组(不包括深度为-1的元素)
- 计算是否能够合批(相邻元素不能合批立即打断,批次+1)
-
Mask
- Mask会打断合批,但是相同Mask之间可以合批,Maks下的子物体可以合批
- RectMask2D会打断合批,RectMask2D之间不能进行合批,RectMask2D下的子物体可以合批
-
填充率注意要点
- 避免UI重合,即使是透明的图片,文本
-
优化细节
- 填充率优化
- 图片切9宫格
- UI显示和隐藏
- 单个
- 一组Canvas
- 打断合批的操作
- 修改localPosition.z 猜测:退出了批处理,打断相邻的元素的批处理
- localRotation 旋转读书会影响合批