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就是打断合批的元凶),然后根据情况去处理。

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

### 回答1: Unity UGUI降低DrawCall的方法有以下几种: 1. 并UI元素:将多个UI元素并成一个,减少DrawCall的数量。 2. 使用Sprite Atlas:将多个Sprite打包成一个Sprite Atlas,可以减少DrawCall的数量。 3. 使用UI Mask:使用UI Mask可以减少DrawCall的数量,因为它可以将不需要渲染的部分遮挡住。 4. 使用UI Canvas:使用UI Canvas可以将UI元素分组,减少DrawCall的数量。 5. 使用UI Batch:使用UI Batch可以将相同的UI元素量渲染,减少DrawCall的数量。 以上是几种常见的降低Unity UGUI DrawCall的方法,可以根据实际情况选择适的方法来优化游戏性能。 ### 回答2: Unity UGUIUnity 引擎中用于构建 UI 界面的一种工具。当开发 2D/3D 游戏时,UGUI 组件是不可或缺的。但是在使用 UGUI 过程中会遇到诸如性能问题、卡顿等问题,其中最常见的一个问题就是 DrawCall 瓶颈。下面将简单介绍 UGUI 是什么、什么是 DrawCall,以及如何降低 DrawCall 瓶颈。 首先,UGUIUnity 引擎中的一种组件,用于构建 UI 界面。它提供了许多基本组件,如按钮、文本、图像等,开发者可以通过拖拽的方式创建 UI 界面。UGUI 是一个比较复杂的系统,它的性能也受到很多因素的影响,其中就包括 DrawCall。 那么什么是 DrawCall 呢?简单来说,DrawCall 指的是每个物体的渲染次数。当一个物体需要进行渲染时,Unity 就会进行一次 DrawCall。如果一个场景中有很多物体需要渲染,那么就会有很多次 DrawCall,这个时候就会导致游戏卡顿,影响游戏体验。 为了降低 DrawCall,我们可以采取以下一些措施: 1. 并网格:将多个小物体并成一个大的物体,这样就可以减少 DrawCall 次数。 2. 使用 Atlas:将多个纹理打包成一个图集。如果一个 UI 界面中需要显示多个图像,那么使用 Atlas 可以大大降低 DrawCall 次数。 3. 使用静态处理:将相同材质的物体进行并,并在处理中共同渲染。 4. 使用动态处理:将相同材质的物体进行并,并使用GPU实例化渲染。 5. 减少使用图像:在不影响游戏体验的前提下,尽量减少 UI 界面中的图像使用。 总的来说,降低 DrawCall 可以有效提高游戏性能,保证游戏流畅运行。UGUI 是一个非常强大的工具,帮助开发者构建出精美的 UI 界面,但是要注意性能问题,尽量减少对游戏性能的影响。 ### 回答3: UGUIUnity官方提供的UI系统,功能非常强大,可以快速制作各种UI界面和交互,但是有时候会出现性能问题,比如Drawcall过多导致游戏卡顿。那么如何降低UGUIDrawcall呢? 1. 并Mesh 在制作UI时,尽量使用同一个材质球,然后将相邻的UI元素的Mesh并成一个大的Mesh,将多个小的Drawcall成一个大的Drawcall。 2. 使用图集 将多个图片并成一个图集,可以有效减少Drawcall数量。可以使用Unity自带的Sprite Packer工具或其他第三方工具来打包图集。注意,打包时要理布局,尽量让相邻的图集使用同一个材质球。 3. 使用UI控件 尽量使用Unity自带的UI控件,比如Button、Image、Text等,这些控件已经经过优化,性能较高。 4. 避免使用RawImage和Mask RawImage和Mask会导致额外的Drawcall,尽量避免使用。 5. 使用Canvas组件的Render Mode 在Canvas组件的Render Mode里面,可以选择几种不同的渲染模式,其中Screen Space - Overlay和Screen Space - Camera模式性能最高。 6. 使用UI Offscreen Rendering 将UI元素渲染到RenderTexture中,然后再将RenderTexture显示在屏幕上,这样可以减少Drawcall数量,但是需要注意RenderTexture的大小和数量,否则会带来额外的开销。 总的来说,降低UGUIDrawcall是一项比较复杂的工作,需要在选择材质球、并Mesh、设置Render Mode和使用UI控件等方面都进行优化,才能达到较好的效果。同时要注意,不是Drawcall越少越好,还要保证UI的质量和用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值