Unity学习笔记 - UI System(一)
转载请注明出处:
EnigmaJJ
http://www.cnblogs.com/twjcnblog/p/5850648.html
术语
Canvas是Unity的原生组件,Unity的渲染系统使用Canvas来提供绘制在游戏世界中的分层几何结构。
Canvas的职责是将他所包含的几何体组合成batches,生成合适的渲染命令并将这些命令发送给Unity的图形系统。所有这些都是由C++代码完成的,被称为rebatch或batch build。当Canvas被标记为需要rebatch时,该Canvas就被认为是dirty的。
几何体是通过Canvas Renderer组件提供给Canvas的:
Sub-canvas是嵌套在Canvas组件中的另一个Canvas。Sub-canvas将他所包含的控件从他的父Canvas隔离。dirty Sub-canvas不会强制他的父Canvas去重构父Canvas中的几何体,反之也一样(有一些特殊的情况,例如当父Canvas引起Sub-canvas的尺寸发生变化,那么Sub-canvas就不得不重构他包含的几何体)。
Graphic是Unity UI C#库提供的一个基类。所有提供可绘制几何体(例如Image、Text)到Canvas系统的Unity UI C#类都继承自Graphic。绝大多数内置的Unity UI图形都是通过Graphic的子类MaskableGraphic实现的,这些图形可以通过MaskableGraphic实现的IMaskable接口来实现遮罩效果:
Layout组件用于控制RectTransform的尺寸和位置。Layout组件只依赖于RectTransform并且只对与自己相关的RectTransform的属性有影响。Layout组件不依赖于Graphic类,能够独立于Unity UI的Graphic组件来使用。
Layout组件和Graphic组件都依赖于CanvasUpdateRegistry类。该类会追踪需要被更新的Layout组件和Graphic组件,并且在这些组件相关的Canvas调用willRenderCanvases事件时触发update。
Layout组件和Graphic组件的更新被称为rebuild。
渲染细节
在使用Unity UI时,要记住所有由Canvas渲染的几何体都是在Transparent队列渲染的。也就是说,所有几何体都是使用Alpha Blend按照从后往前的顺序渲染的。从性能角度出发就意味着每个光栅化的像素都会被采样,即使该像素会被其他的不透明几何体完全覆盖。在移动设备上,这种高水平的overdraw将会迅速超过GPU的fill-rate能力。
Canvas Batch构建过程
Batch构建过程是指Canvas组合他所包含的UI元素的网格并生成合适的渲染命令发送给Unity图形管线的过程。构建过程的结果会被缓存起来并且被重用直到Canvas被标记为dirty,无论何时当组成Canvas的网格有任何一个发生变化时Canvas就会被标记为dirty。
Canvas使用的网格是从附加在Canvas上的Canvas Renderer组件中获取的,但不会从Sub-canvas中获取。
Batch的计算需要根据深度排序网格,需要检测网格共享的材质等等。这个操作是多线程的,所以他的性能通常在不同的CPU架构上会有很大的不同,特别是在移动芯片(通常只有少量的CPU核心)以及桌面CPU(通常有4个甚至更多的CPU核心)之间性能区别很大。
Graphics重建过程
Graphics重建过程是指Unity UI C#图形组件的网格和布局重新计算的过程。该过程是在CanvasUpdateRegistry类中通过函数PerformUpdate执行的。
PerformUpdate的执行过程分为三步:
1. Dirty Layout组件通过函数ICanvasElement.Rebuild重构他们的布局
2. 任何已注册的裁剪组件(例如Masks)对可裁剪的组件进行裁切,这是通过函数ClippingRegistry.Cull完成的
3. Dirty Graphic组件对他们包含的图形元素进行重建
Layout的重建分为三部分:PreLayout、Layout以及PostLayout。Graphic的重建分为两部分:PreRender以及LatePreRender:
Layout重建
为了重新计算Layout组件所包含组件的位置和尺寸,以合适的的层级顺序应用Layouts是十分必要的。靠近根节点的Layouts有可能会改变嵌套在他里面的Layouts的位置和尺寸,因此必须优先计算。
Unity UI会将dirty Layout组件根据他们在层级中的深度进行排序,层级高(也就是父Transform数量少)的Layout会被移到队列的前面。
已排序的Layout组件接着会重建他们的布局,此时Layout组件所控制的UI元素的位置和尺寸会发生更改。
Graphic重建
当Graphic组件重建时,Unity UI使用ICanvasElement接口的Rebuild函数(可以见上图第3步)。Graphic实现该接口,在重建过程的PreRender阶段会执行两个不同的重建步骤:
1. 如果顶点数据被标记为dirty(例如组件的RectTransform改变了尺寸),那么网格将被重建
2. 如果材质数据被标记为dirty(例如组件的材质或纹理发生了变化),那么附加到Canvas Renderer上的材质将被更新
Graphic重建不需要按任何特定的顺序来遍历Graphic组件,也不需要任何排序操作。
Unity学习笔记 - UI System(一)的更多相关文章
- A.Kaw矩阵代数初步学习笔记 5. System of Equations
“矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...
- Android学习笔记⑤——UI组件的学习TextView相关
TextView是一个强大的视图组件,直接继承了View,同时也派生出了很多子类,TextView其作用说白了就是在布局中显示文本,有点像Swing编程中的JLabel标签,但是他比JLabel强大的 ...
- Unity学习笔记 之 关于 Unity UI 的 Slider 的代码记录
代码例如以下: using UnityEngine; using System.Collections; //1.引入 UI . using UnityEngine.UI; public class ...
- 微软企业库Unity学习笔记
本文主要介绍: 关于Unity container配置,注册映射关系.类型,单实例.已存在对象和指出一些container的基本配置,这只是我关于Unity的学习心得和笔记,希望能够大家多交流相互学习 ...
- Unity学习笔记(二)——第一个Unity项目Hello Unity
保留版权,转载请注明出处:http://blog.csdn.net/panjunbiao/article/details/9318811 在这一篇文章里,参照宣雨松的<Unity 3D游戏开发& ...
- Unity学习笔记(5):动态加载Prefab
第一种方法,从Resources文件夹读取Prefab Assets/Resources文件夹是Unity中的一个特殊文件夹,在博主当前的认知里,放在这个文件夹里的Prefab可以被代码动态加载 直接 ...
- unity学习笔记1--Space Shooter
其实我一直觉得我是个模棱两可的人,就计算机这块来说,自己还是想制作游戏什么的,但是又得考虑到现实就业的问题,所以现在自己主要在学安卓和javaweb.现在大概是心血来潮吧,突然想追逐下自己的理想,虽然 ...
- Unity学习笔记 - Assets, Objects and Serialization
Assets和Objects Asset是存储在硬盘上的文件,保存在Unity项目的Assets文件夹内.比如:纹理贴图.材质和FBX都是Assets.一些Assets以Unity原生格式保存数据,例 ...
- Unity学习笔记
『 知识点』 [射线] 射线检测碰撞 『游戏实战』 个例 [E]<愤怒的小鸟> 资源 免费Unity基础教程(中文电子书) [E] noobtus(Unity游戏教程)
随机推荐
- 安装virtualenvwrapper
理解:virtualenv 和 virtualenvwrapper 是两种东西,前者可以单独使用,后者是管理前者的工具,尤其是当有多个 virtualenv(隔离环境时).所以下面的配置都是在为了使用 ...
- [美团 CodeM 初赛 Round A]最长树链
题目大意: 给你一棵带点权的树,找出一个最长的树链满足链上点权的最大公因数不为1. 思路: 暴力DP. 对于每个点,记录一下以这个点为一个端点的所有链的最大公因数及长度. 然后暴力转移一下,时间复杂度 ...
- 1.10(java学习笔记)super关键字
supe主要是调用父类中被重写的方法及属性. 用下列代码那说明: package cn.hcf.TestSuper; public class TestSuper { public static vo ...
- 五角数 Exercise06_01
/** * @author 冰樱梦 * 题目:五角数 * 时间:2018年下半年 * * */ public class Exercise06_01 { public static void main ...
- 微服务之SpringCloud实战(一):SpringCloud简介
什么是微服务架构 微服务架构就是系统架构设计的一种风格,它主旨将一个独立的系统,拆分成各个微服务,各个微服务独立运行,他们之间通过Http的Restful API进行通信,拆分出来的微服务是根据原系统 ...
- xshell与虚拟机无法连接
遇到xshell无法连接到虚拟机的情况,我大概总结为以下几种情况: 1.宿主机或虚拟机中的防火墙阻止了xshell的访问. 关闭宿主机和虚拟机中的防火墙,linux虚拟机中的防火墙关闭为 :servi ...
- Linux虚拟机小问题解决方法系列
1)使用虚拟机的过程中,会碰到虚拟机占用的空间越来越大的情况,即使删除了虚拟机里的文件,磁盘空间还是似乎还是没有释放,使用“vmware-vdiskmanager”工具解决.解决方法在这里:参考.合并 ...
- iOS开发 Swift开发数独游戏(五)显示游戏答案
要点是设置好Tag就好,通过代码找到并初始化即可. 1: // 2: // ShowAnswerController.swift 3: // sudoku-v02 4: // 5: // ...
- 【摘】请问make -j8 和make -j4 是什么意思?什么作用?
看到别人写的Shell脚本中有 make -j8 等字眼,Google了一下,网友说是: make linux kernel/rootfs时候多线程执行.
- Oracle审计--AUD$占用空间较大处理方案
Oracle 11G以后,数据库默认是开启审计功能的,因此有时候我们忘记了关闭该功能导致SYSTEM表空间暴满,但由于关闭审计功能需要重启数据库,此类操作生产环境下是不允许的,因此我们需要找出哪类审计 ...