转载请注明出处:

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(一)的更多相关文章

  1. A.Kaw矩阵代数初步学习笔记 5. System of Equations

    “矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...

  2. Android学习笔记⑤——UI组件的学习TextView相关

    TextView是一个强大的视图组件,直接继承了View,同时也派生出了很多子类,TextView其作用说白了就是在布局中显示文本,有点像Swing编程中的JLabel标签,但是他比JLabel强大的 ...

  3. Unity学习笔记 之 关于 Unity UI 的 Slider 的代码记录

    代码例如以下: using UnityEngine; using System.Collections; //1.引入 UI . using UnityEngine.UI; public class ...

  4. 微软企业库Unity学习笔记

    本文主要介绍: 关于Unity container配置,注册映射关系.类型,单实例.已存在对象和指出一些container的基本配置,这只是我关于Unity的学习心得和笔记,希望能够大家多交流相互学习 ...

  5. Unity学习笔记(二)——第一个Unity项目Hello Unity

    保留版权,转载请注明出处:http://blog.csdn.net/panjunbiao/article/details/9318811 在这一篇文章里,参照宣雨松的<Unity 3D游戏开发& ...

  6. Unity学习笔记(5):动态加载Prefab

    第一种方法,从Resources文件夹读取Prefab Assets/Resources文件夹是Unity中的一个特殊文件夹,在博主当前的认知里,放在这个文件夹里的Prefab可以被代码动态加载 直接 ...

  7. unity学习笔记1--Space Shooter

    其实我一直觉得我是个模棱两可的人,就计算机这块来说,自己还是想制作游戏什么的,但是又得考虑到现实就业的问题,所以现在自己主要在学安卓和javaweb.现在大概是心血来潮吧,突然想追逐下自己的理想,虽然 ...

  8. Unity学习笔记 - Assets, Objects and Serialization

    Assets和Objects Asset是存储在硬盘上的文件,保存在Unity项目的Assets文件夹内.比如:纹理贴图.材质和FBX都是Assets.一些Assets以Unity原生格式保存数据,例 ...

  9. Unity学习笔记

    『 知识点』 [射线] 射线检测碰撞 『游戏实战』 个例 [E]<愤怒的小鸟> 资源 免费Unity基础教程(中文电子书) [E] noobtus(Unity游戏教程)

随机推荐

  1. 【函数式权值分块】【分块】bzoj1901 Zju2112 Dynamic Rankings

    论某O(n*sqrt(n))的带修改区间k大值算法. 首先对序列分块,分成sqrt(n)块. 然后对权值分块,共维护sqrt(n)个权值分块,对于权值分块T[i],存储了序列分块的前i块的权值情况. ...

  2. 10.2(java学习笔记)JDBC事务简述

    一.事务 事务是指作为一系列操作组成的一个整体,该整体只有两种状态,要么全部执行,要么全部不执行. 当组成这个事务的所有语句都执行成功则该事务执行,只要有一条语句执行失败则该事务不执行. 假设这里有一 ...

  3. dubbo安装(转载)

    1.   概述 ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.名字服务.分布式同步.组服务等.ZooKeeper的目标就是封装好复杂 ...

  4. 事务的实现就是利用数据库锁(行锁,表锁等),且db上锁,都是在操作之前上锁

    悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的关系型数据 ...

  5. 【java 正则表达式】记录所有在java中使用正则表达式的情况

    本篇记录在java中邂逅正则表达式的所有美丽瞬间.因为在java和js中正则表达式的语法并不一致. 1.匹配字符串中有出现[2.1开头或者&2.1或者&3.1等的] Pattern m ...

  6. Activiti 5.22 spring

    <!-- activiti依赖 --> <dependency> <groupId>org.activiti</groupId> <artifac ...

  7. Java程序运行的内存分配

    Java的内存分配 A:栈 存储局部变量 B:堆 存储所有new出来的 C:方法区(程序代码及方法相关) D:本地方法区(系统相关) E:寄存器(CPU使用) 注意: a:局部变量 在方法定义中或者方 ...

  8. iOS:友盟SDK分享

    友盟SDK分享   基本步骤: 1.注册友盟开发者账号 2.登陆账号,添加新应用,获取AppKey 3.下载并安装SDK 4.解压SDK压缩包,将形如UMSocial_sdk_x.x.x文件拖入工程中 ...

  9. 异常值监测的方法 Tukey test

    参考: https://www.zhihu.com/question/38066650

  10. MooseFS分布式文件系统介绍及安装教程详解

    MFS系统由4个部分构成:master.metalogger.chunkserver.client. 1.Master —— mfs的大脑,记录着管理信息,比如:文件大小,存储的位置,份数等,和inn ...