优化Unity UI的指南——UI的基础知识(一)

翻译:https://unity3d.com/learn/tutorials/topics/best-practices/fundamentals-unity-ui

理解组成Unity UI系统的不同部分是很重要的。有几个基本类和组件一起组成系统。本章首先定义了本系列文章中使用的一些术语,然后讨论了Unity UI的几个关键系统的底层行为。

术语

Canvas是一个原生代码Unity组件,Unity的渲染系统使用它来提供分层的几何体,这些几何体将被绘制到游戏世界空间中,或者游戏世界空间的顶部。

画布负责将其组成的几何体组合成批次,生成适当的渲染命令并将这些命令发送到Unity的图形系统。所有这些都是在本机C ++代码中完成的,称为rebatch或batch build。当Canvas被标记为包含需要rebatching的几何体时,Canvas被视为脏的。

Canvas Renderer组件为Canvases提供了几何体。

子画布就是嵌套在另一个画布组件中的画布组件。子画布将他们的孩子与他们的父母隔离开来;脏子节点不会强制父节点重建其几何结构,反之亦然。在某些情况下,这是不正确的,例如当对父画布的更改导致子画布的大小被调整时。

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

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

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

Graphic和Layout组件的更新称为重建。本文档后面将进一步详细讨论重建过程。

渲染细节

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

批量构建过程(Canvases)

批处理构建过程是这样一个过程:画布将UI元素的网格组合起来,并生成适当的呈现命令发送到Unity的图形管道。这个过程的结果被缓存和重用,直到画布被标记为脏,当它的一个组成网格发生变化时,就会发生这种情况。

Canvas使用的网格是取自附加在Canvas不包含在任何Sub Canvas中的Canvas Renderer组件集。

计算批次需要对网格进行深度排序,并检查重叠、共享材料等。这个操作是多线程的,所以它的性能在不同的CPU架构中通常会有很大的差异,特别是在移动的soc(通常只有很少的CPU内核)和现代的桌面CPU(通常有4个或更多的内核)之间。

重建过程(Graphics)

重建过程是Unity UI c#图形组件的布局和网格被重新计算的过程。这在CanvasUpdateRegistry类中执行的。请记住,这是一个C#类,它的源代码可以在Unity的Bitbucket上找到。

在CanvasUpdateRegistry中,感兴趣的方法是PerformUpdate。只要Canvas组件调用WillRenderCanvases事件,就会调用此方法。每帧调用此事件一次。

PerformUpdate运行三个步骤:

  • 要求脏布局组件通过ICanvasElement.Rebuild方法重建其布局。
  • 要求任何已注册的剪辑组件(如蒙版)剔除任何剪切的组件。这是通过ClippingRegistry.Cull完成的。
  • 要求脏图形组件重建其图形元素。

对于布局和图形重建,该过程分为多个部分。布局重建分为三个部分(PreLayout,Layout和PostLayout),而Graphic重建运行在两个部分(PreRender和LatePreRender)。

Layout重建

要重新计算一个或多个布局组件中包含的组件的适当位置(以及可能的大小),必须以适当的层次顺序应用布局。靠近GameObject层次结构中的根的布局可能会改变可能嵌套在其中的任何布局的位置和大小,因此必须首先计算。

为此,Unity UI按层次结构中的深度对脏布局组件列表进行排序。层次结构中较高的项目(即具有较少的父变换)将移动到列表的前面。

然后请求排序的布局组件列表重建其布局; 这是实际更改由布局组件控制的UI元素的位置和大小的位置。有关布局如何影响各个元素位置的更多详细信息,请参阅Unity手册的UI自动布局部分。

Graphic重建

重建Graphic组件时,Unity UI将控制权传递给ICanvasElement接口的Rebuild方法。Graphic实现了这一点,并在重建过程的PreRender阶段运行了两个不同的重建步骤。

如果顶点数据已标记为脏(例如,当组件的RectTransform已更改大小时),则重建网格。
如果材料数据已标记为脏(例如,当组件的材质或纹理已更改时),则将更新附加的Canvas Renderer材质。
图形重建不会以任何特定顺序通过图形组件列表,也不需要任何排序操作。

你可能感兴趣的:(Unity3D)