Unity UGUI Canvas基础知识及优化

2023-11-07

unityUGUI源码:https://github.com/Unity-Technologies/uGUI.git
官方API:https://docs.unity3d.com/cn/2018.4/ScriptReference/Canvas.html

Canvas基础知识

在这里插入图片描述
在这里只能讲一些思路,具体实现还是得看项目中运用相对应的处理方式去处理
Canvas是Unity渲染系统给层状几何体( layered geometry(几何) )提供的可以被画入、被放在上面或者放在世界空间的底层Unity组件。Canvas负责将它包含的几何体组合成batch,生成合适的渲染命令发送给Unity图形系统。这个过程在底层的C++代码中完成,这个过程被称为一次rebatch或者一次batch build。当一个Canvas被标记为包含需要rebatch的几何体时,这个Canvas被认为是dirty的。

几何图形由Canvas Renderer 组件提供给 Canvases 。

Sub-canvas只是一个嵌套在另一个 Canvas 组件中的 Canvas 组件。子画布将他们的孩子与他们的父母隔离开来;肮脏的孩子不会强迫父母重建其几何形状,反之亦然。在某些极端情况下这是不正确的,例如当父 Canvas 的更改导致子 Canvas 被调整大小时。

Graphic是 Unity UI C# 库提供的基类。它是为 Canvas 系统提供可绘制几何图形的所有 Unity UI C# 类的基类。大多数内置的 Unity UI 图形都是通过MaskableGraphic子类实现的,这允许它们通过IMaskable接口进行屏蔽。Drawable的主要子类是Image和Text ,它们提供了它们的同名组件。

Layout components control RectTransform 的大小和定位,通常用于创建需要相对大小或相对定位其内容的复杂布局。布局组件仅依赖于 RectTransforms,并且只影响其关联的 RectTransforms 的属性。它们不依赖于 Graphic 类,可以独立于 Unity UI 的 Graphic 组件使用。

Graphic 和 Layout 组件都依赖于CanvasUpdateRegistry类,该类未在 Unity 编辑器的界面中公开。此类跟踪必须更新的 Layout 组件和 Graphic 组件的集合,并在其关联的 Canvas 调用willRenderCanvases事件时根据需要触发更新。

渲染细节

在 Unity UI 中编写用户界面时,请记住所有由 Canvas 绘制的几何图形都将在透明队列中绘制。也就是说,Unity UI 生成的几何图形将始终使用 alpha 混合从后到前绘制。从性能的角度来看,要记住的重要一点是,从多边形栅格化的每个像素都将被采样,即使它完全被其他不透明的多边形覆盖。在移动设备上,这种高水平的过度绘制会迅速超过 GPU 的填充率容量。

批量构建过程(画布)

批处理构建过程是 Canvas 组合表示其 UI 元素的网格并生成适当的渲染命令以发送到 Unity 的图形管道的过程。此过程的结果将被缓存并重复使用,直到 Canvas 被标记为脏,只要其组成网格之一发生更改,就会发生这种情况。
画布使用的网格取自附加到画布但不包含在任何子画布中的一组画布渲染器组件。
计算批次需要按深度对网格进行排序,并检查它们是否存在重叠、共享材料等。此操作是多线程的,因此其性能在不同的 CPU 架构之间通常会有很大差异,尤其是在移动 SoC(通常只有很少的 CPU 内核)和现代桌面 CPU(通常有 4 个或更多内核)之间。

重建过程(图形)

重建过程是重新计算 Unity UI 的 C# 图形组件的布局和网格的地方。这是在CanvasUpdateRegistry类中执行的。请记住,这是一个 C# 类,它的源代码可以在Unity 的 Bitbucket上找到。
在CanvasUpdateRegistry中,感兴趣的方法是PerformUpdate 。每当 Canvas 组件调用WillRenderCanvases事件时,都会调用此方法。此事件每帧调用一次。
PerformUpdate 运行一个三步过程:
通过ICanvasElement.Rebuild方法请求脏布局组件重建其布局。
任何已注册的 Clipping 组件(例如 Masks)都被要求剔除任何被剪裁的组件。这是通过 ClippingRegistry.Cull 完成的。
脏图形组件被要求重建它们的图形元素。
对于布局和图形重建,该过程分为多个部分。布局重建分三个部分(PreLayout、Layout 和 PostLayout)运行,而图形重建分两个部分(PreRender 和 LatePreRender)运行。

布局重建

要重新计算包含在一个或多个布局组件中的组件的适当位置(以及可能的大小),有必要以适当的分层顺序应用布局。在 GameObject 层次结构中更接近根的布局可能会改变可能嵌套在其中的任何布局的位置和大小,因此必须首先计算。
为此,Unity UI 按其在层次结构中的深度对脏布局组件列表进行排序。层次结构中较高的项目(即具有较少父变换的项目)被移动到列表的前面。
然后请求布局组件的排序列表来重建它们的布局;这是由 Layout 组件控制的 UI 元素的位置和大小实际改变的地方。有关单个元素的位置如何受布局影响的更多详细信息,请参阅 Unity 手册的UI 自动布局部分。

图形重建

重建 Graphic 组件时,Unity UI 将控制权传递给ICanvasElement接口的Rebuild方法。Graphic 实现了这一点,并在重建过程的 PreRender 阶段运行两个不同的重建步骤。
如果顶点数据已被标记为脏(例如,当组件的 RectTransform 已更改大小时),则重新构建网格。
如果材质数据已被标记为脏(例如,当组件的材质或纹理已更改时),则附加的 Canvas Renderer 的材质将被更新。
图形重建不会以任何特定顺序通过图形组件列表进行,也不需要任何排序操作。

优化

  1. Cavas的Render Mode是Overlay模式时,永远覆盖在其他物体之上,不受摄像机depth影响
  2. Cavas的Render Mode都是Screen Space-Camera时的渲染顺序: 依次由选取的摄像机Render Camera的Depth值、Cavas的Sorting Layer先后顺序(可上下拖动调节顺序)、Order in Layer值决定
    同一canvas下:
    改变控件transform的SiblingIndex,
    transform.GetSiblingIndex();
    transform.SetSiblingIndex(int index); //index值越大,越后渲染,层级越大,越显示在前面
    不同Canvas下:
    设置Canvas下的Sort Order //Sort Order值越大,越后渲染,层级越大,越显示在前面
    所以,在设计UI的时候要注意每个item(比如这里的Button)中的使用不同图集的UI元素越少越好,且在排列的时候尽量让来自不同图集的UI元素不重叠,一旦重叠,会打乱原来的渲染拓扑关系,造成DC上升
  3. Canvas里面添加其他UI元件的时候,这些元件实际上就是被这个Canvas统和在一起了。比如,同一个Canvas里面有100个Image,Canvas将会把100个单独的Mesh合并成一个大的ShareMesh,用于渲染。如果刚好这100个Image都是使用了相同的图片或者是同一个图集里面的图片,那么由于使用的Mesh只有一个(ShareMesh),材质球都是同一个(内置的默认材质球),贴图也是同一张,所以得到的结果就是,DrawCall只有一个。
    这实际上就是UGUI最基本的优化思路了。合并ShareMesh、合并图集,减少DrawCall,动静分离等
    动静分离
    在UGUI中,网格的更新或重建(为了尽可能合并UI部分的DrawCall)是以Canvas为单位的,且只在其中的UI元素发生变动(位置、颜色等)时才会进行。因此,将动态UI元素与静态UI元素分离后,可以将动态UI元素的变化所引起的网格更新或重建所涉及到的范围变小,从而降低一定的开销。而静态UI元素所在的Canvas则不会出现网格更新和重建的开销。
    先写这些,后面再加

官方介绍挺详细的:https://learn.unity.com/tutorial/optimizing-unity-ui#5c7f8528edbc2a002053b59f

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity UGUI Canvas基础知识及优化 的相关文章

  • unity网络资源导入

    1 找到需要导入的文件 这里导入fbx格式 2 打开unity界面 在Asset目录下创建文件夹FBX 将需要导入的fbx预制体或整个文件夹拖入创建的FBX文件夹下 3 选中需要的fbx预制体并拖至场景中 4 双击定位到当前物体 5 找到需
  • FBX导入Unity中模型没有材质的处理

    一 3dMax导出FBX时的注意事项 导出时 确保maps文件存在 里面放着fbx用到的image 二 在Unity中的设置 1 文件拖入Unity的Assets文件夹中 2 查看模型的材质是否存在 如下所示 材质为None 此时拖入sce
  • Unity与Android的Back键冲突解决

    Unity与Android的Back键冲突解决 上一篇的最后留下了两个问题 Unity视图下横屏闪退 Unity视图下Android无法响应back返回上一activity 对于第一个问题 应该是Unity横屏下视图的某些设置跟Androi
  • unity中创建询问弹出窗口

    在开发过程中进程会遇到需要弹出一个窗口询问用户是否进行的操作 今天就来制作一个这样弹出窗口 然后根据弹出窗口的选择内容不同进行不同的操作 本例中主要是为了删除一个数据 而在删除数据操作前需要得到用户的一个确认操作 这里面主要用到了Notif
  • Unity学习笔记(一)—— 基础知识

    一 基础知识 1 开发团队组成 2 unity特点 图形界面 所见即所得 入门简单 支持C 比OC C 更友好 js 国内外资源丰富 因为使用的人多 跨平台性好 PC端 移动端等 对VR AR的支持最完善 3 成功案例 游戏 炉石传说 神庙
  • unity工程崩溃资源找回

    1 Unity死机未保存场景 当你在Unity中编辑场景 突然死机时 可以在项目文件目录中找到Temp文件夹 双击文件夹 找到 Backupscenes文件夹 把后缀为 backup的文件后缀改为 unity 然后拖进Unity的Proje
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • unity3d大型互动照片墙

    1 本次应客户需求 制作一个大型照片墙互动 输出分辨率为9600 4320 注 unity3d官方推荐最大分辨率为8192 3686 4 经过现场长达24小时暴力测试中途未发生问题 姑且判定可以达到正常标准 废话不多说 先上效果 unity
  • Unity保存图片到相册

    Unity保存图片到Android相册 Java 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  • unity3d切换场景Application.LoadLevel(1)含义

    Application LoadLevel 1 场景ID
  • 【性能优化】MySql查询性能优化必知必会

    本文内容主要包括以下几个方面 分析查询SQL MySQL查询优化器 数据库存储结构 索引 索引维护 索引设计 SQL优化 表结构设计 分库分表 查询功能架构设计 分析查询SQL MySQL提供了一个性能分析工具 EXPLAIN 它可以帮助我
  • Redis10大性能优化策略

    1 Redis为什么变慢了 1 Redis真的变慢了吗 对 Redis 进行基准性能测试 例如 我的机器配置比较低 当延迟为 2ms 时 我就认为 Redis 变慢了 但是如果你的硬件配置比较高 那么在你的运行环境下 可能延迟是 0 5ms
  • 解读 | VR体验式教育的优势 让教育触手可及

    大家好 我是极智视界 欢迎关注我的公众号 获取我的更多前沿科技分享 邀您加入我的知识星球 极智视界 星球内有超多好玩的项目实战源码和资源下载 链接 https t zsxq com 0aiNxERDq 很多孩子过多地沉浸在所谓的 传统教育
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • Golang拼接字符串性能对比

    g o l a n g golang g o l an g
  • 线上企业展厅:企业发展新利器,轻松实现线上企业展示

    引言 在当今数字化时代 线上企业展厅已经成为企业展示品牌形象 推广产品的重要手段 它不仅可以帮助企业拓宽市场 提升品牌知名度 还能为企业带来更多的商业机会 那么线上企业展厅有什么优势 如何搭建成功的线上企业展厅 一 线上企业展厅的优势 1
  • 游戏开发常见操作梳理之NPC任务系统

    多数游戏存在任务系统 接下来介绍通过NPC触发任务的游戏制作代码 using System Collections using System Collections Generic using UnityEngine
  • 游戏开发常见操作梳理系列之——玩家信息的显示系统

    在游戏中 有不少游戏在左上角会出现玩家的头像和等级以及血量 这就是玩家的信息显示系统 那么这些是如何制作的呢 接下来我将讲讲代码的操作 其它操作我会在其它笔记中一一说明 敬请期待 信息的显示相当简单就是控制一些UI 然后在其它系统里面填写相
  • 游戏开发常见操作梳理之小地图的制作

    游戏中一般存在小地图系统 实际上就是设置一个新的摄像机放置在玩家的正上方 然后在小地图上显示新摄像机看见的东西就可以了 在小地图上一般存在放大地图和缩小地图的按钮可以方便放大和缩小地图 这些操作是如何实现的呢 接下来直接上核心代码 usin
  • 游戏开发常见操作梳理之角色选择一

    进入游戏后 我们经常会进入角色选择的界面 通常是左右两个按钮可以更改角色供玩家选择 对于这种界面我们通常使用数据持久化将角色信息存储起来 接下来的笔记中 我将使用自带的数据持久化系统对其进行操作 实现角色的选择页面 后续会更新xml系列的文

随机推荐

  • mvc:default-servlet-handler和mvc:annotation-driven成对出现的原因

  • [人工智能-深度学习-62]:环境搭建 - 增加或更换硬盘,SSD/SATA/SAS哪个好?

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 人工智能 深度学习 62 环境搭建 增加或更换硬盘 SSD SATA SAS哪个好 文火冰糖 王文兵 的博客 CSDN博客 第1章 硬盘的分
  • Linux提权

    目录 编辑 一 信息收集 Linux脏牛内核漏洞 SUID 1 信息收集 2 SUID提权 案例 1 SUID提权配合脚本 2 本地配合内核漏洞 3 脏牛内核漏洞演示 linux exploit suggester 二 定时任务 环境变量
  • SQL注入原理-数值型注入

    小伙伴们大家好 本期为大家带来的是SQL注入原理 数值型注入的讲解 目录 SQL注入原理 数值型注入 编辑 1 测试是否存在注入点 2 判断字段个数 3 找出可以回显的字段 4 查询数据库的信息 1 查看当前的数据库 2 查看当前数据库的用
  • 操作系统调度算法

    在操作系统中存在多种调度算法 其中有的调度算法适用于作业调度 有的调度算法适用于进程调度 有的调度算法两者都适用 下面介绍几种常用的调度算法 先来先服务 FCFS 调度算法 FCFS调度算法是一种最简单的调度算法 该调度算法既可以用于作业调
  • ddt+BeautifulReport,报告展示用例描述,unittest用例统计

    当前使用的ddt来管理测试数据 需要读取测试数据内每一条case的描述 修改之前 修改途径 ddt源码内 将test data docstring get test data docstring func v 修改为 test data d
  • 【Java】得到当前股票信息

    import java io BufferedReader import java io InputStreamReader import java net HttpURLConnection import java net URL pub
  • Java TreeMap排序

    TreeMap实现了SortedMap接口 根据键自然排序 要求键必须是可比较的 要么指定Comparator比较器 如果没有Comparator比较器 键要实现Comparable接口 package Map import java ut
  • linux查看某文件夹下各个文件大小

    例如 我想查看 app 下各个文件的大小 cd app du h max depth 0 解释 cd app 进入 app 文件夹 du h max depth 0 查看文件夹下各个文件的大小 其中 0 代表查看 本文件夹 在这儿是app文
  • 如何实现前端项目的自动化测试?

    这其实就是我们常说的 UI自动化测试 针对这个问题 我先告知答题思路如下 1 什么是UI自动化 有什么优势 2 UI自动化实践中会遇到什么难题 3 如何解决难题 将UI落实到实践中 重点 4 UI自动化学习资料推荐 一 什么是UI自动化 为
  • 解决macos安装升级时报错安装所选更新时发生错误的问题

    系统有更新 下载到一半时点了取消下载 然后再等有空的时候点击安装更新一直失败 解决方法为 重新启动Mac 并按住Command R进入恢复模式 找到Terminal后输入csrutil disable 然后重启Mac 再次下载并安装更新 重
  • 第16章Stata面板数据分析

    目录 16 1短面板数据分析 案例延伸 延伸 关于模型的选择问题 16 2长面板数据 案例延伸 延伸 进行随即系数模型回归分析 面板数据 Panel Data 又被称为平行数据 指的是对某变量在一定时间内持续跟踪观测的结果 面板数据兼具了横
  • java: 错误: 不支持发行版本 5 报错的解决

    今天在使用maven配置好logback的依赖后 满心欢喜的去运行了一下 结果却报了 java 错误 不支持发行版本 5 在网上查了一下发现是jdk版本太高不支持编译java5版本的二进制 而这个问题常常是导入maven依赖时会遇到的 下面
  • React Hooks之useContext

    useContext const value useContext MyContext 接收一个 context 对象 React createContext 的返回值 并返回该 context 的当前值 当前的 context 值由上层组
  • Java多线程Jdbc_Java连接数据库 #01# JDBC单线程适用

    官方教程 包括 javase的基础部分 JDBC Basics 重新梳理 学习一下 Java连接数据库 相关的内容 因为最开始没有认真学多线程和JDBC 一直在自己写的多线程程序中维持下面的错误写法 多个线程共用一个connection c
  • Xshell安装及与服务器建立连接过程

    Xshell是Windows下一款功能非常强大的安全终端模拟软件 支持Telnet Rlogin SSH SFTP Serial 等协议 可以非常方便的对linux主机进行远程管理 Xshell下载地址 https www netsaran
  • 从站寄存器EEPROM内容解析之SII(Slave Information Interface)

    从站寄存器EEPROM内容解析之SII Slave Information Interface 一 EEPROM 的构造如下表所示 ESI 使用字编址 这里特别注意是字编址 那么实际上一个16进制的数 两个单位数0x1601 才表示一个单位
  • Epoll模型讲解

    首先我们来定义流的概念 一个流可以是文件 socket pipe等等可以进行I O操作的内核对象 不管是文件 还是套接字 还是管道 我们都可以把他们看作流 之后我们来讨论I O的操作 通过read 我们可以从流中读入数据 通过write 我
  • Linux 进程卡住了怎么办?

    在我们使用 Linux 系统时 如果网络或者磁盘等 I O 出问题 会发现进程卡住了 即使用 kill 9 也无法杀掉进程 很多常用的调试工具 比如 strace pstack 等也都失灵了 是怎么回事 此时 我们使用 ps 查看进程列表
  • Unity UGUI Canvas基础知识及优化

    unityUGUI源码 https github com Unity Technologies uGUI git 官方API https docs unity3d com cn 2018 4 ScriptReference Canvas h