Unity.UGUI DrawCall合批笔记

前言

昨天在通过FrameDebug查看DrawCall时,发现批次结果与理解中的不一致,又去补充了一下这方面知识,笔记记录下,只关乎UGUI。

基础场景

首先列一下无法合批的一些基础场景

1.图片无图集或图集不同,图片是运行时生成的

2.字体不同

3.对象缩放不同

4.材质不同

5.有Mask或RectMask2D组件

特殊场景

在不存在任一基础场景下,有些特殊场景也会导致无法合批

1.Z轴偏大或偏小的元素。 这种元素通常是不显示在Game视图内的,发现这个是因为之前一直以为在Game视图外的元素是不参与渲染,也就不会产生DrawCall。但是事实并不是如此,因为UGUI系统并不会自动剔除相机视野外的元素。而且由于我把元素的Z坐标设置的异常大(-55555),导致又触发了强制分离批次机制,即当Z坐标设置过大/小时,Unity会认为该UI元素深度严重偏离其他元素,从而强制分批,避免视觉错误。在这种情况下,原UI元素的正常DrawCall是9,但是由于触发了强制分批,会导致本身应该合批的也没有进行合批,DrawCall飙升到了22。这种情况下,应该采用的方式是给元素添加CanvasGroup组件,alpha设置为0,不参与渲染。这样既保留了元素的逻辑,又不会增加DrawCall。

2.**UI存在遮挡关系。**这是最常见的场景,明明图集一样,材质和其他所有设置都一样,但是仍然无法合批,通过FrameDebug去查看时,会发现被其他元素打断了。举个例子,Toast一般是由一个Image背景和Text内容组成的预制体,当快速弹出多个Toast时(假设没有缩放动画),之前的理解是只会有2个DrawCall,一个是Image,一个是Text。但是实际情况下,每多一个Toast,DrawCall都会增加2。这是因为这些Toast之间存在了遮挡关系,因为Toast都是在一个地方出现的,当快速弹出多个时,很多个Toast重叠在一起,Image之间的合批被穿插的Text打断,同理Text的合批被Iamge打断,导致无法合批。但是当错开Toast时,比如将一个重叠的Toast移出重叠区域,这时会发现DrawCall降低了2,当把所有Toast都移动一下,保证互不重叠时,会发现,所有Taost加起来也只有2个DrawCall,即合批成功了。这只是一种简单的场景,实际UI界面中,因为存在背景,渐变,透明等原因,实际渲染效果并不一定跟Hierarchy完全一致,此时就会因为遮挡问题导致打断合批。要尽量减少这些打断合批的情况,需要开发规划好UI元素结构,结合FrameDebug找出打断合批的元凶(比如本来DrawMesh20和DrawMesh23正常情况下是要合批的,但是现在分开了,那么DrawMesh21,22就是打断合批的元凶),然后根据情况去处理。

遇到更多场景再更新...

相关推荐
可爱系程序猿12 小时前
Unity 材质预览才弹 d3dcompiler_47.dll?先分清编辑器 SDK、着色器缓存和玩家包
程序人生·3d·unity·电脑·材质
xcLeigh12 小时前
Unity基础:使用Transform控制物体缩放——localScale与lossyScale的区别
unity·游戏引擎·教程
L@ncor12 小时前
第五章 基于低代码平台的智能体搭建 · 学习笔记(Coze / Dify / FastGPT / n8n)
笔记·学习·低代码·agent·prompt工程
知潮网12 小时前
被嫌弃的五仁月饼,一吨千元在养猪场翻了身
笔记
2601_9606312312 小时前
中药前处理及提取的工艺环节与技术要点
笔记
2601_9653842612 小时前
口腔黏膜清洁中的几何约束与流体动力学边界层问题分析
经验分享·笔记
一米阳光866113 小时前
软考高级【信息系统项目管理师】高项重要考点(9)组织 助你顺利上岸!
笔记·职场发展·软考·高项·信息系统项目管理师·高级职称
白杨尚青14 小时前
C++入门篇(十):string(上)——认识string:构造与三大遍历(一条龙讲透operator[]、迭代器、auto、范围for)
java·开发语言·c++·笔记·stl
Chen—LSN14 小时前
C语言——⽂件操作(1)
c语言·开发语言·c++·经验分享·笔记·算法·链表
Chen—LSN14 小时前
C语言——文件操作(2)
c语言·开发语言·c++·经验分享·笔记·算法·c#