Unity学习笔记 - UI System(一)

转载请注明出处:html

EnigmaJJcanvas

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接口来实现遮罩效果:
ui

    Layout组件用于控制RectTransform的尺寸和位置。Layout组件只依赖于RectTransform而且只对与本身相关的RectTransform的属性有影响。Layout组件不依赖于Graphic类,可以独立于Unity UI的Graphic组件来使用。spa

    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组件,也不须要任何排序操做。

相关文章
相关标签/搜索