Unity - 搬砖日志 - UGUI合批优化 - Overlap(UI AABB 有重叠), Z != 0 照样合批的方案

news2024/12/24 11:38:41

文章目录

  • 环境
  • 目的
  • Screen Space - Overlay
  • 优化
    • 限制
    • 该方案起源


环境

Unity : 2020.3.37f1
Pipeline : BRP

(另一个项目在 2021.1.xx 的 LTS 下的 URP 管线同样如此,目测:因为 UGUI 不受渲染管线切换而变化)


目的

便于索引,记录搬砖


Screen Space - Overlay

可以看到,下图
Canvas 的 Render Mode 在使用: Screen Space - Overlay 模式下的DC为 8
在这里插入图片描述

这里导致合批失败的有两个问题:

  1. 图片显示有相互的堆叠遮挡
  2. 部分UI组件的localPosition.z != 0

UI AABB overlap
在这里插入图片描述在这里插入图片描述

localPosition.z != 0
在这里插入图片描述

DrawCall 就会增加很多
在这里插入图片描述

相当于一个都合批不了,要是UI复杂,有多,那么性能就渣渣了


优化

如下图

我们修改了这些内容,即可合批:

  • Canvas Render Mode 调整为:Screen Space - Camera,并指定相机
  • 然后将 UI 的 Hierarchy 层级嵌套要展平,需要同级化
  • 然后 shader 需要开启 alpha test 和 ZWrite On, ZTest LEqual

在这里插入图片描述

Canvas Render Mode 调整为:Screen Space - Camera,并指定相机
在这里插入图片描述

然后将 UI 的 Hierarchy 层级嵌套要展平,需要同级化
在这里插入图片描述

Alpha Test, ZWrite On, ZTest LEqual
在这里插入图片描述

在这里插入图片描述


限制

这个方案目前总结下来有那么一些限制:

  1. 如果透明区域不是偏向 矩形的,那么只能开启 alpha test
  2. 如果开其alpha test 那么边缘效果黑背景混合锯齿感比较强
  3. hierarchy 视图中的 go 层级需要调整,导致无法使用 parent 的整体移动
  4. 如果需要整体移动需要自己写组件同步位置

该方案起源

其他项目组的一位 TA 大佬,分享了一下 UI 的 AABB Overlap 下的合批
结果他自己做了一些尝试,发现可以这么整
这种如果有 UGUI 黑箱部分的合批逻辑,都会比较好处理(比如,如果你们项目有购买 unity 引擎源码,那是可以一探究竟,甚至可以自行修改的)

然后我们没有unity引擎源码,在这种情况下,这位TA大佬都测试出来了,真的牛逼

(然后这种方式其实在 UWA UGUI 优化课程中也有讲到类似的优化,到时连接我就不方便发了,给自己看,我也贴上来吧:Unity - UGUI 优化 (NGUI vs UGUI) - 笔录 - UWA大神推荐学习篇)


因此我将这次大佬的研究成果直接记录笔记,便于后续索引,备忘


另外,这些内容纯纯是搬砖,都是基于别人的引擎(unity引擎)下使用UGUI 的一些问题

较真怎么才不属于搬砖:

  • 寻找硬件物质材料
  • 制作硬件
  • 制作芯片
  • 编写硬件芯片驱动程序
  • 编写操作系统
  • 再操作系统上编写编程语言(不使用二进制指令的编写方式,规模大就不可维护)
  • 编写编译器
  • 编写IDE
  • 使用你自己的IDE编写引擎APP
  • 再使用你自己的系统编写引擎的渲染器
  • 再编写渲染与硬件加速渲染结合

那么恭喜你,终于不是搬砖了

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

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

相关文章

IDEA启动Tomcat控制台乱码问题解决方法

最近项目需要用到Tomcat跑一个项目,但是开发Sprintboot项目久了,也很少用Tomcat,因为Springboot是集成Tomcat等中间件的,所以不需要下载Tomcat,好了,回归真题,本博客介绍跑Tomcat过程遇到的控制…

信道编码【编码、纠错检错】

差错控制的基本概念--数字信号在传输过程中,由于信道传输特性不理想及加性噪声的影响,不可避免地会发生错误。 可通过以下三方面的措施来减小误码率:1)提高信道容量;2)降低编码效率;3&#xff…

Binder系列--ServiceManager的启动

ServiceManager的启动 hongxi.zhu Android 13 主要流程: 1. 启动ServiceManager进程 ServiceManager是由init(pid 1)进程启动的 system/core/rootdir/init.rc on init......# Start essential services.start servicemanager //framework层使用start hwservic…

Linux | Ubuntu卸载QQ

Linux | Ubuntu卸载QQ 终端输入: dpkg -l| grep qq如下图,找到QQ文件: 删除命令: sudo apt-get --purge remove 文件名在终端输入: sudo apt-get --purge remove libqqwing2v5:amd64如下图删除成功

【Java程序设计实训】基于B/S架构的MyShop商城

MYSHOP商城 实验目的实验概述系统功能概述Myshop 商城概述系统开发分析功能列表系统用例图系统活动图 数据库设计运作界面展示用户管理模块新用户注册用户登录商城首页与用户退出 商品模块商品分页展示查看商品详情信息 购物车模块空购物车页面加入商品到购物车 订单模块提交订…

4.32UDP通信实现 4.33广播 4.34组播 4.35本地套接字通信

4.32UDP通信实现 ![在这 udp_client.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <arpa/inet.h>int main() {// 1.创建一个通信的socketint fd socket(PF_INET, SOCK_DGRAM, 0);if(fd -1) {…

springboot项目外卖管理 day08-缓存优化

文章目录 一、缓存优化问题说明环境搭建导入maven坐标配置yml文件设置序列化器&#xff0c;编写配置类 缓存短信验证码缓存菜品数据实现思路 SpringCacheSpring Cache介绍Spring Cache常用注解Spring Cache使用方式 缓存套餐数据实现思路 一、缓存优化 问题说明 环境搭建 导入…

【Framework】startService启动流程

前言 启动service有两种方式&#xff1a;startService和bindService。 这一篇先讲startService&#xff0c;读者如果只想看流程图&#xff0c;可以直接跳到总结。 1. ContextImpl 代码路径&#xff1a;frameworks\base\core\java\android\app\ContextImpl.java 1.1 startServ…

SHA-256算法及示例

1. 引言 SHA-256&#xff08;安全哈希算法&#xff0c;FIPS 182-2&#xff09;是密码学哈希函数&#xff0c;其摘要长度为256位。SHA-256为keyless哈希函数&#xff0c;即为MDC&#xff08;Manipulation Detection Code&#xff09;。【MAC消息认证码有key&#xff0c;不是key…

【数据库】外键的作用

前言 说到外键&#xff0c;一般就会牵扯出约束。不谈约束&#xff0c;起始外键就是一个普通的字段&#xff08;Column&#xff09;&#xff0c;起到一个关联的作用。 先把约束放一边&#xff0c;看看外键有哪些作用。 建立表中记录的一对一的关系 学生表&#xff1a; 手机表…

C++引用计数

文章目录 1. 什么是引用计数2. 引用计数的实现3. 示例代码 1. 什么是引用计数 引用计数&#xff08;reference count&#xff09;的核心思想是使用一个计数器来标识当前指针指向的对象被多少类的对象所使用&#xff08;即记录指针指向对象被引用的次数&#xff09;。它允许有多…

Linux--查找文件指令:find

语法&#xff1a; find pathname -name 文件名 示例&#xff1a; 从根目录下开始查找名字中带file.txt文件的路径

C++思维导图以及作业

定义一个命名空间Myspace&#xff0c;包含以下函数&#xff1a;将一个字符串中的所有单词进行反转&#xff0c;并输出反转后的结果。例如&#xff0c;输入字符串为"Hello World"&#xff0c;输出结果为"olleH dlroW"&#xff0c;并在主函数内测试该函数。 …

战略书籍排行榜前五名

战略管理对企业的重要性不言而喻。有效的战略管理可以帮助企业确定未来的方向和目标、制定长期发展规划、提高企业的竞争力和获得市场份额。本文推荐的这5本优秀的战略管理类书籍&#xff0c;每一本都有其独特的思想和实践价值&#xff0c;值得企业管理者借鉴和学习。 战略书籍…

Leetcode---351周赛

周赛题目 2748. 美丽下标对的数目 2749. 得到整数零需要执行的最少操作数 2750. 将数组划分成若干好子数组的方式 2751. 机器人碰撞 一、美丽下标对的数目 这题没什么好说的&#xff0c;按照题目的要求直接暴力求解&#xff0c;代码如下 bool gcd(int x,int y){if(x1||y1)…

vue父子组件之间相互控制传值,子组件使用$parent直接控制父组件的值

父子组件之间相互控制传值&#xff0c;子组件控制父组件的值 需求概述 父组件在提交表单后&#xff0c;弹框进行提示&#xff0c;子组件是一个弹框。 vue版本 v2.x 实现原理 在父组件内建立控制器isShowModal&#xff0c;使用v-if来控制子组件的显示与隐藏。在子组件通过…

DAY39——动态规划part2

1.考虑障碍在起点和终点的特殊状况&#xff0c;可直接返回0 2.判断是否存在障碍物&#xff1a;初始化时需要设置障碍物后的坐标为0

常见存储引擎

TiKV 简介 TiKV 是一个分布式事务型的键值数据库&#xff0c;提供了满足 ACID 约束的分布式事务接口&#xff0c;并且通过Raft协议保证了多副本数据一致性以及高可用。TiKV 作为 TiDB 的存储层&#xff0c;为用户写入 TiDB 的数据提供了持久化以及读写服务&#xff0c;同时还存…

Spring BeanFactory FactoryBean的区别?

文章目录 前言一、BeanFactory二、FactoryBean 前言 面试中被问到过Spring BeanFactory FactoryBean的区别&#xff1f;当时没答上来&#xff0c;感觉这就是一个文字游戏&#xff0c;后面仔细的了解了一下&#xff0c;分享给大家。 一、BeanFactory 在 Spring 中最核心的就是…

GDB 断点管理

1、b 设置断点 usage 1: b 函数名 usage 2: b 文件名:行号 2、rb 函数名关键字 &#xff1a; 所有带有这个关键字的函数名都设置为断点 (gdb) rb dkauth Breakpoint 7 at 0x34187ae0: file /home/jintao/cvf/apps/cvf/services/dkauth/src/dkauth.c, line 58. void dkauth_…