Unity 关于UGUI动静分离面试题详解
前言
近期有同学面试,被问到这样一道面试题:
”说说UGUI的动静分离是怎么一回事?”
关于这个优化有一些误区,容易让开发者陷入一个极端。我们先分析关于UGUI 合批优化的问题,最后给这个面试题一个参考回答。
对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!
Unity UGUI 到底采用的是哪种合批技术?
Drawcall合批技术,我们一般是有动态合批,静态合批,GPU Instancing合批。对于GUI部分,游戏引擎合批一般采用哪些技术呢?这个取决于游戏引擎的实现,比如Unity UGUI采用的是静态合批,预先把Mesh等合并好,而Cocos Creator 引擎采用的是通用的动态合批。为什么不使用GPU Instancing合批呢?主要可能考虑有几个原因:半透明,九宫格,tiledmap等相关的处理,这类GPU Instancing不适合处理。不是所有的设备与显卡支持GPU Instancing, 兼容性不如动态合批or静态合批。所以大部分游戏引擎的UI,要么采用静态合批,要么采用动态合批。”静态合批与动态合批”都会导致一个问题,就是要重新计算与合并Mesh。”静态合批”合批的一个好处就是合并完后如果内部的UI元素没有位置等信息没有修改,就不用重新计算,渲染的时候直接把合并好的数据提交渲染就可以了。”动态合批”是遍历每个可以合批的UI元素,将数据合并后一起提交给GPU渲染。动态合批更灵活,更通用。
Unity UGUI 合批的开销分析
UGUI 是基于Canvas来进行合并计算的。这样会导致以下几个问题:
1: 不同Cavans的UI元素,是无法合批渲染的,无法使用同一个drawcall;
2: 每次合并的时候,会合并计算Canvas下所有的UI元素, 具体的算法流程为:
Step1: 一开始计算合并Cavans下所有的UI元素;
Step2: 每帧提交合并后的结果给GPU渲染;
Step3: 当某个UI元素改变以后,先计算某个UI元素改变后的数据,再结合其它UI元素,重新合并到一起。
3: 每次UI元素的位置等相关信息改变,都会引发合并计算;
4: “不动物体”的合并计算开销是最小的,如果Cavans下所有的UI元素一旦创建都不再改变,那么合并计算这块只要计算一次,性能最好。
5: 当Cavans下有不断变化的物体时,每次都会有合并计算,此时不动的物体少,那么最后合并的时候物体的数据就少。
由上面的分析,很多人就得到一个结论: 动静分离,将不变的物体放一个canvas,变化的物体放一个canvas下,优化合并时候的开销。进而有人推导出来: “每个界面一个Cavans。然后面试时,被奉为经典,导致大家回答每个界面我们都做一个Canvas。减少Mesh合并的开销。”
每个UI界面都做Canvas到底有没有必要?
假设有两个界面,界面A(50个UI元素),界面B(50个UI元素), 他们可以合批。假设界面A中的所有UI元素都不变化,界面B中的每个UI元素的位置在不断的改变,我们来分别讨论以下,界面A,界面B共用一个Canvas与界面A,界面B分开两个Cavans在合并上的开销。
情况1: 界面A,界面B共用一个Cavans;
Step1: 计算界面A中每个UI节点元素转换后的位置等信息, 计算A50个元素,计算一次;
Step2: 计算界面B中每个UI节点元素转换后的位置等信息,计算B50个元素,由于变化,每次都计算
Step3: 将A的50个元素信息(只计算一次) + B的50个元素信息,合并成100大的mesh,一起提交;
情况2; 界面A,界面B共用2个Cavavns;
Step1: 计算界面A中单个UI节点元素转换后的位置等信息, 计算A50个,计算一次;
Step2: 合并界面A中的所有的UI节点元素数据,合并计算一次,将结果每次提交给GPU渲染;
Step3: 计算界面B中单个UI节点元素转后的位置等信息,计算B50个,每次改变都计算;
Step3: 将B50个信息合并导一起,提交给GPU进行渲染,每次都要合并,将结果提交给GPU渲染;
仔细比对,我们发现,情况1比情况2好的点是,A,B可以一起提交,节约drawcall。情况2比情况1好的点是最后合并的时候,不用copy A的50个元素信息的数据,其它合并计算并没有太大的差别。
情况1比情况2能节约一个drawcall, 情况2比情况1在合并的时候,少copy 50个数据。
经上面分析,基于多Canvas的”动静分离”会打乱合批,能节省的是”合并时不变的元素的数据copy”。
总结: 没有必要每个UI界面都做一个Cavans, 一般我们做开发的时候,常规的游戏UI界面做一个Cavans, 大规模的弹出式滚动列表可以考虑做一个Cavans。游戏元素,如2D游戏中角色,2D/3D游戏中的玩家昵称,角色血条等,可以做一个Cavans。一般项目中2~3个Cavans就可以了。还是要把重点放在drawcall优化上。
参考回答: 说说UGUI的动静分离是怎么一回事?
最后给出这个面试题的参考回答:
Unity UGUI 会基于Canvas,将能合并的UI元素,计算合并到一起,然后再提交给GPU渲染来节约Drawcall,在这个过程中,如果某个UI元素改变了,就会引发一次合并计算。”动静分离”一般指的是把那些不经常动的UI与经常动的2D元素分成不同的Cavans,来减少合并时候的开销。这个通常叫做”动静分离”。我们在开发项目的时候,会把经常变化的游戏元素(2D游戏角色,玩家昵称,玩家血条等)做到一个Cavans下。把通常的游戏操作UI界面做一个Cavans下,对于那些UI内容非常多的如”任务滚动列表”等,我们也会考虑单独做一个Cavans,然后持续监测UI性能即可。有人说每个界面做一个Cavans,个人觉得没有必要。如果UI部分有性能问题,再具体问题具体分析即可。
更多教学视频
Unity3Dwww.bycwedu.com/promotion_channels/2146264125
相关文章:
Unity 关于UGUI动静分离面试题详解
前言 近期有同学面试,被问到这样一道面试题: ”说说UGUI的动静分离是怎么一回事?” 关于这个优化有一些误区,容易让开发者陷入一个极端。我们先分析关于UGUI 合批优化的问题,最后给这个面试题一个参考回答。 对惹,…...
HarmonyNext保存Base64文件到Download下
本文介绍如何保存Base64的文件到Download下 参考文档地址: 保存用户文件-Harmony Next 用到的是DOWNLOAD模式保存文件 用户在使用save接口时,可以将pickerMode配置为DOWNLOAD模式,该模式下会拉起授权接口,用户确认后会在公共路径…...
069_基于springboot的OA管理系统
目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…...
hive数据库,表操作
1.创建; create database if not exists myhive; use myhive; 2.查看: 查看数据库详细信息:desc database myhive; 默认数据库的存放路径是 HDFS 的: /user/hive/warehouse 内 补充:创建数据库并指定 hdfs 存储位置:create database myhive2 location /myhive2 3.…...
openpnp - 在顶部相机/底部相机高级校正完成后,需要设置裁剪所有无效像素
文章目录 openpnp - 在顶部相机/底部相机高级校正完成后,需要设置裁剪所有无效像素概述笔记设置后的顶部相机效果设置后的底部相机效果 备注END openpnp - 在顶部相机/底部相机高级校正完成后,需要设置裁剪所有无效像素 概述 用自己编译的基于openpnp-…...
Vue+TypeScript+SpringBoot的WebSocket基础教学
成品图: 对WebSocket的理解(在使用之前建议先了解Tcp,三次握手,四次挥手 ): 首先页面与WebSocket建立连接、向WebSocket发送信息、后端WebSocket向所有连接上WebSoket的客户端发送当前信息。 推荐浏览网站…...
大话网络协议:HTTPS协议和HTTP协议有何不同?为什么HTTPS更安全
大家现在访问网络,浏览网页,注意一下的话,网址前面基本上都是一个 https:// 的前缀,这里就是说明这个网址所采用的协议是 https 协议。那么具体应该怎么理解 https 呢? 本文我们就力争能清楚地解释明白这个我们目前应该最广的协议。 理解HTTP协议 要解释 https 协议,当…...
13图书归还-云图书管理系统(Vue3+Spring Boot+element plus)
目录 1 接口地址2 后台代码RecordControllerBookController 3 view/books/BookRecordsVue中前端框架搭建4 api/record.js文件写查询用户借阅记录的接口代码5 api/book.js中写归还图书、查询当前借阅图书接口代码6 BookRecordsVue中导入接口函数,并调用7 运行效果 1 …...
中航资本:“女人的茅台”重挫!超7700亿元英伟达概念业绩爆发
今天早盘首要指数强势震动,申万一级工作指数跌多涨少,通讯指数涨逾1%居首。概念方面,存储器、动保、重组等概念板块涨幅居前。存储概念大涨首要仍是AI方向又有好消息,市值逾越7700亿元的英伟达概念龙头SK海力士发布效果超预期财报…...
day7:软件包管理
一,软件包概述 软件包概述 软件包用于安装,升级,卸载一个软件 软件包类型 二进制包 源码经过了编译(而且成功了)后产生的包,二进制包是linux下默认的安装包 编译好的文件,直接使用ÿ…...
探索Konko AI:快速集成大语言模型的最佳实践
探索Konko AI:快速集成大语言模型的最佳实践 引言 随着大语言模型(LLM)的普及,如何快速方便地集成这些模型成为众多开发者关注的焦点。Konko AI 提供了一个全面管理的 API,使开发者能够选择合适的开源或专有大语言模…...
网络地址和本地网络地址
本地网络地址(Local Network Address,简称 LNA)是指在一个子网内用于标识特定主机的部分。在 IPv4 地址中,一个完整的 IP 地址由两部分组成:网络地址部分(Network Address)和本地网络地址部分&a…...
【closerAI ComfyUI】AI绘画界新技术RF Inversion图像编辑和风格迁移!能跟ipadapter争高低吗?
AI绘画界新技术RF Inversion图像编辑和风格迁移!能跟ipadapter争高低吗? 在人工智能绘画领域,技术的创新永不止步。closerAI ComfyUI最近推出了一项名为RF Inversion的新技术,它能够进行图像编辑和风格迁移,为艺术家和…...
【Spring篇】Spring的Aop详解
🧸安清h:个人主页 🎥个人专栏:【计算机网络】【Mybatis篇】【Spring篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 目录 🎯初始Sprig AOP及…...
Spring与其他框架的比较
Spring 框架因其丰富的功能和灵活性,在 Java 领域内得到了广泛应用。然而,在不同的应用场景下,开发者可能会选择其他框架。下面将 Spring 框架与其他一些常见的 Java 框架进行比较,以便更好地理解它们各自的优缺点和适用场景。 1…...
论当前的云计算
随着技术的不断进步和数字化转型的加速,云计算已经成为当今信息技术领域的重要支柱。本文将探讨当前云计算的发展现状、市场趋势、技术革新以及面临的挑战与机遇。 云计算的发展现状 云计算,作为一种通过网络提供可伸缩的、按需分配的计算资源服务模式&a…...
Spring Boot 整合 RocketMQ 之消息消费手动提交 ACK 实战【案例分享】
前言: 上一篇我们分享了 RocketMQ 消息重试的一些基本原理,本篇我们基于 Spring Boot 整合 RocketMQ 来分享一下 RocketMQ 消息基于手动提交的案例,在分享手动进行消息 ACK 中也会分享消息重试的使用。 RocketMQ 系列文章传送门 RocketMQ …...
胃癌数据集(不定期更新)
恶性肿瘤其实就是癌症的一种,它是由一些不正常的细胞组成的,这些细胞会不停地生长和繁殖,而且它们还会侵犯周围的正常组织,甚至通过血液和淋巴系统跑到身体其他部位去。 恶性肿瘤有以下几个特点: 1、无限制生长&…...
zh/FAQ/CentOSStream-CentOS Stream 常见问题
CentOS Stream 是什么? CentOS Stream 是一个为开发者而设的发行版本,目的是要协助社群中的成员、Red Hat 伙伴及其它人在一个较稳定及可预测的 Linux 生态环境下充分利用创新的开源程序。 它的内容正是 Red Hat 有意收录于下个稳定版 RHEL 的软件。任何…...
多台西门子PLC与多台三菱PLC之间实时通讯的方案(PLC内不用编程)
PLC通讯智能网关IGT-DSER模块支持西门子、三菱、欧姆龙、罗克韦尔AB、GE等各种品牌的PLC之间通讯,同时也支持PLC与Modbus协议的变频器、智能仪表等设备通讯。网关有多个网口、串口,也可选择WIFI无线通讯。PLC内无需编程开发,在智能网关上配置…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
