转载请注明出处:

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. CentOS 6.9使用Setup配置网络(解决dhcp模式插入网线不自动获取IP的问题)

    说明:dhcp模式插入网线不自动获取IP是因为网卡没有激活,造成这种原因的,应该是安装系统时没有插入网线造成的. 解决方法: 修改网卡配置文件 vim /etc/sysconfig/network-s ...

  2. Spring.NET的IoC容器(The IoC container)——简介(Introduction)

    简介 这个章节介绍了Spring Framework的控制反转(Inversion of Control ,IoC)的实现原理. Spring.Core 程序集是Spring.NET的 IoC 容器实 ...

  3. 通过Roslyn动态生成程序集

    之前写过篇文章如何通过Roslyn构建自己的C#脚本,今天本来打算测试一下这部分API在新的版本中的变化,结果发现它的脚本引擎找不到了,翻了一下官方文档,貌似说暂时性的移除了.便看了一下它动态生成程序 ...

  4. FTTB FTTC FTTH FTTO FSA

    FTTB Fiber to The Building 光纤到楼 FTTC Fiber to The Curb 光纤到路边 FTTH Fiber to The Home 光纤到家 FTTO Fiber ...

  5. golangWEB框架gin学习之获取get参数

    原文地址:http://www.niu12.com/article/40package main import ( "fmt" "github.com/gin-gonic ...

  6. final修饰符的三种使用场景

    final有三种使用场景,各自是修饰变量.方法和类.不管哪种修饰.一旦声明为final类型.你将不能改变这个引用了,编译器会检查代码,假设你试图再次初始化,编译器会报错.以下我来详细说说每一种修饰场景 ...

  7. 2015年Ubuntu最新Redmine的安装和配置

    近期须要在公司内部搭建一个项目管理平台Redmine,在摸索了一天之后.最终配置成功,在这里分享给大家. 公司server的系统是Ubuntu14.04,要安装的是最新的Redmine3.0. 因为R ...

  8. gflops

    这个网站最棒了 http://kyokojap.myweb.hinet.net/gpu_gflops/

  9. 蒙皮 skin

    http://help.autodesk.com/view/MAYAUL/2016/CHS/?guid=GUID-EFE68C08-9ADA-4355-8203-5D1D109DCC82 skin:顶 ...

  10. 'telnet' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    Win7或者win8等是默认没有安装telnet功能,所以你直接用telnet命令是用不了的: 下面介绍在win8下面如何操作:“控制面板”-->“程序”(在左下角)-->程序和功能--- ...