UGUI性能优化学习笔记(二)合批

news2024/11/18 20:17:09

一、合批规则

合批:把渲染时使用相同材质、相同贴图的网格合并在一起,成为一个大网格,然后再调用一次Draw Call,直接渲染这一个大网格。这样做可以降低Draw Call的数量,以优化性能。

Unity是如何确定哪些网格可以进行合批的呢?

  • 首先,合批是以Canvas为单位进行的。也就是说在不同Canvas下的UI元素是无法合批的。
  • 接下来需要计算Canvas下所有UI元素的深度值。深度值计算规则如下:
    • 如果当前UI元素不进行渲染,则Depth = 1
    • 如果当前UI元素没有其他UI元素与其相交,则Depth = 0
    • 如果当前UI元素与其他UI元素相交,则判断它们能否进行合批(Material ID、Texture ID是否相等),如果满足合批的条件,则它们的Depth相同;如果不满足合批条件,则取下方UI的最大深度值,并在其基础上+1。
  • 计算完深度值后,按照「深度值->Material ID->Texture ID->Renderer Order(Hierarchy面板上的顺序)」对UI元素进行排序,剔除深度值为-1的元素,形成一个队列。
  • 根据得到的队列,判断相邻元素之间的材质和贴图是否相同,只要相同就可以进行合批。注意这里不会对深度值进行判断,即使相邻元素深度值不同,只要满足上述条件也可以进行合批。

下面我们通过一个具体的示例加深理解

在上图中,白色Image位于所有UI元素的最底层,所以Depth = 0。接下来的文本位于白色Image的上层,所以Depth = 1。这里需要注意,UI元素进行深度判断是通过网格进行的,而不是通过rect。

接下来对红色Image进行判断。因为下层的UI元素有白色的Image和Text两个,所以取它们之间深度值最大的那个。又因为Text和红色Image的材质与贴图都不相同,所以肯定无法进行合批。所以红色Image的Depth为Text的深度值+1,即Depth = 2。

再上层的黄色Image因为与下层的红色Image材质与贴图相同,可以进行合批,所以其深度值与红色Image的深度值相同,即Depth = 2。蓝色Image同理。

接下来就是按照前面的规则对UI元素进行排序,生成排序后的队列,并确定哪些元素可以合批。通过Profiler窗口,我们可以很方便地查看当前场景的合批情况。并且会列出打断合批的原因。

二、遮罩组件

2.1 Mask

UGUI中的Mask组件有两个特点:

  • 一个Mask组件除了绘制自身产生一次Draw Call外,还会额外产生两次Draw Call
  • Mask会打断外部UI元素与内部UI元素的合批

Mask的额外两次Draw Call

Mask在渲染之前,会遍历所有子元素并计算一次模板缓存。将需要绘制的部分的模板缓冲值设置为1,不需要绘制的部分设置为0。这步操作需要调用一次Draw Call。同时,在执行过程中,Mask会被设置一个特殊的材质。这也是导致其内部元素无法与外部元素合批的原因。

绘制完成后,还需要将模板缓冲值恢复,这就又造成了一次Draw Call。

不同Mask间合批

虽然Mask会导致外部的元素无法与内部的元素进行合批,但由于不同的Mask添加的特殊材质是相同的,所以不同的Mask之间可以进行合批。我们来看下面这个例子

当场景中存在一个Mask时,总的Batches数量为4。当我们再添加另一个Mask,可以发现Batches并没有发生变化

被剔除的元素仍会参与计算

虽然被Mask遮挡的UI元素没有被绘制出来,但它仍然会参与合批的计算。我们尝试将一个Mask拖拽到另一个Mask剔除的UI元素区域。可以看到Batches增加到了7。这是因为被剔除的UI元素参与了合批计算,影响了深度值排序,从而导致无法进行合批。

2.2 RectMask2D

RectMask2D组件是基于自身Rect范围对下方的子元素进行裁剪实现的遮罩效果。这种实现方式有两个优点:

首先,RectMask2D本身不产生任何Draw Call。当场景中只有一个RectMask2D,且自身不挂载Image的情况下,场景中的Batches只有1(摄像机产生的Draw Call)

其次,处于遮罩范围外的子元素会被直接裁剪,不会影响合批计算。我们拖动遮罩下的子元素,可以看到顶点数量和Batches的变化

完全移出Mask范围的UI元素也不会参与合批计算

不同Mask间无法合批

RectMask2D也并不是完全没有缺点,它有个致命的问题是不同的Mask间无法进行合批。下图所示的情况,在Mask内部的UI元素材质、贴图完全相同的情况下仍然存在4次Draw Call。

将内部的UI元素隐藏,可以发现剩余两个Draw Call。这是因为RectMask2D本身挂载的Image是可以进行合批的。

2.3 Mask还是RectMask2D?

由此可见,Mask和RectMask2D各有优劣,并没有谁一定比谁的性能更优这一说,最重要的是要结合应用场景进行取舍。比如当一个场景中需要用到许多个遮罩,且内部的UI元素都是可以进行合批的,那么显然Mask要更适用。而如果一个场景中只需要一个遮罩,那么本身不占用Draw Call且不容易打断合批的RectMask2D要更适合些。

三、参考资料

[1]. https://www.laowangomg.com/?p=488
[2]. https://www.cnblogs.com/moran-amos/p/13878493.html
[3]. https://www.cnblogs.com/moran-amos/p/13883818.html
[4]. https://www.sikiedu.com/course/538

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/54893.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]JAVA毕业设计货币博物馆展品管理系统(系统+LW)

[附源码]JAVA毕业设计货币博物馆展品管理系统(系统LW) 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项…

常用框架技术- 08 Spring Cloud简单易懂、易部署和易维护的分布式系统开发工具包

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言1.微服务理论1.1 微服务的特点1.2 微服务与微服务架构1.3 微服务的优点2.分布式集群概念2.1 分布式集群概念2.1.1 什么是分布式2.1.2 什么是集群2.1.3 分布式集群…

新品上线 Naive Admin Tenant 开箱即用多租户开发框架

Naive Admin Tenant 是一套企业级的权限管理开发平台,采用前后端分离模式,微服务版本前端框架支持多个选择,支持数据库:MySql、Oracle、SqlServer、PostgreSql 等,目前只支持 MySql,后面有客户需求会扩展支…

三维数字沙盘大数据人工智能模拟对抗推演系统开发教程第一课

三维电子沙盘大数据人工智能模拟对抗推演系统开发教程第一课 该数据库中只提供 成都市火车南站附近的数据请注意,104.0648,30.61658 而且该公用服务器带宽不大,所以会有些卡顿,建议下载数据库后本地使用,下载后的数据库有些许变…

《InnoDB引擎八》InnoDB关键特性-两次写

InnoDB 关键特性 InnoDB存储引擎的关键特性包括: Insert Buffer (插入缓冲)Double Write (两次写)Adaptive Hash Index (自适应哈希索引)Async IO (异步IO)Flush Neighbor Page (刷新领接页) 这些特性为InnoDB存储引擎带来了更好的性能以及更高的可靠性。 两次写 …

STM32 定时器单脉冲模式的使用记录

一、我要解决的问题 我的需求 需要单片机几乎同时在A,B,C 三个IO 分别输出T1,T2,T3 时长的高电平,时间结束后,恢复低电平。 初步思路 面对这个需求,我第一时间想到的是用三个定时器,分别设置T1,T2,T3 时…

Win10解决:系统管理员已阻止你运行此应用

前言 Win10安装msi软件包时出现错误提示如下: 解决 按【winR】快捷键打开运行,输入gpedit.msc回车依次进入”Windows设置“—”安全设置“—”本地策略“–”安全选项“—”用户账户控制:以管理员批准模式运行所有管理员“—双击&#xf…

JUC系列(六) 线程池

📣 📣 📣 📢📢📢 ☀️☀️你好啊!小伙伴,我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。 📒 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️,擅…

若依 数据权限图文详细理解及改造

数据权限 所谓数据权限,就是根据不同角色的登录用户,查看不同的列表数据 若依数据权限 若依的数据权限也是基于角色实现的,支持五种权限模式,按权限大小一次排列: 全部数据权限,表示拥有所有部门的数据…

远程办公:通过cpolar内网穿透,远程桌面控制家里公司内网电脑

疫情反反复复的当下,有时候会遇到需要居家办公的情况,但在办公室的电脑上仍有很多重要资料需要存取,且办公室所在的局域网中也有很多相关资源需要被访问(如文件共享服务器、OA系统等)。如何能在家通过远程处理好办公事…

Blend for Visual Studio 概述

https://learn.microsoft.com/zh-cn/visualstudio/xaml-tools/creating-a-ui-by-using-blend-for-visual-studio?viewvs-2022 Blend for Visual Studio 可用于设计基于 XAML 的 Windows 和 Web 应用程序。 它提供了与 Visual studio 相同的基本 XAML 设计体验,并添…

长安汽车董事长下场宣传原力技术 全擎引领电动化出行普及时代

11月30日,长安汽车董事长朱华荣在朋友圈发布了长安汽车擘画未来的全新能源及电动化解决方案:长安原力技术——原力智能增程、原力超集电驱。长安汽车成为业内首个通过微信朋友圈发布全新技术方案的车企。短短的3分钟视频,展露着长安汽车对技术…

Mand Mobile - 滴滴出品的适用于金融项目的 Vue 移动端 UI 组件库,免费开源、灵活快速、丰富实用

推荐一款可用性很强的移动 UI 组件库,交互细致,有不少直接就可以用的金融行业的组件。 关于 Mand Mobile Mand Mobile 是一款由滴滴前端团队出品、专为金融场景设计的移动端 Vue 2 组件库,可以帮助前端开发者快速构建项目,UI 风…

ShaderLab实现序列帧动画

序列帧动画介绍 序列帧动画的原理比较简单,依次播放一系列关键帧图像,当播放速度达到一定数值时,看起来就是一个连续的动画。 序列帧动画有很多实现方式,而通过Shader来实现是性能比较好的一种,是由GPU来进行计算。 效果如下 我们使用一张8x8的纹理图片来实现帧动画 步…

单相半波可控整流电路仿真设计(任务书+lunwen+MATLAB仿真源文件)

目 录 摘 要 4 关键字 4 ABSTACT 5 Key words 5 1 绪论 7 1.1半波整流简介 7 1.2 本文研究的内容 7 1.3 单相半波可控整流电路建模与基本参数 7 2 单相半波可控整流电路(电阻性负载) 10 2.1 电路的结构与工作原理 10 2.2 Matlab下的模型建立 10 2.3 仿真…

使用字典映射关系格式化输出字符串format_map()方法

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 使用字典实现格式化输出 format_map()方法 [太阳]选择题 以下python代码输出正确的一项是? s1姓名:{name},职业:{job} dict1{name:张三,job:学生} print(…

MP5705 底板 用户手册

一、开发板简介1.1 产品简介 MP5705开发板底板适配本公司相关核心板,型号为MP5650(详见MP5650用户手册)。通过核心板底板的模式来设计组成完整的开发。底板与核心板采用4个120pin高速板间连接器对插,型号为PANASONIC公司的AXK5A2…

PCL 曲率计算

一、曲率 点云的曲率及计算_点云侠的博客-CSDN博客_点云曲率计算 曲率是曲线弯曲程度的一个度量。 曲率的分类&#xff1a; 1、主曲率、平均曲率、高斯曲率 主曲率&#xff1a; 主曲率计算源码&#xff1a; // template <typename PointInT, typename PointNT, typen…

在低容错业务场景下落地微服务的实践经验

作者&#xff1a;禾连健康 “健康体检是一个低容错的场景&#xff0c;用户到医院体检&#xff0c;由于 IT 原因导致无法完成预约的项目&#xff0c;会对用户体验造成极大的影响。”* ——禾连健康 CTO 邓志豪 禾连健康成立于 2014 年&#xff0c;是一家从体检场景切入的健康管…

Proxmox虚拟环境搭建

一、Proxmox VE简介 ProxmoxVE 是一个完整的、开源的企业虚拟化服务器管理平台。它在单个平台上紧密集成了 KVM 管理程序和 Linux 容器(LXC)、软件定义的存储和网络功能。通过集成的基于 web 的用户界面&#xff0c;您可以轻松地管理虚拟机和容器、集群高可用性或集成的灾难恢…