Optimizing Unity UI(二):Fundamentals of Unity UI

版本检查: 2017.3-难度: 高级

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

Terminology(术语)

画布(Canvas)是一个本地代码Unity 组件,由Unity 的渲染系统使用,提供分层的几何图形,将绘制在游戏的世界空间或之上。

画布负责将它们的组成几何组合成批,生成适当的呈现命令,并将这些命令发送到Unity 的图形系统。所有这些都是在本机C++代码中完成的,称为重批或批生成。当画布被标记为包含需要重批处理的几何图形时,画布就被认为是脏的。

几何是提供画布渲染组件的画布。

子画布(Sub-canvas)只是一个嵌套在另一个画布组件中的画布组件。子画布将孩子与父母隔离开来;肮脏的孩子不会强迫父母重建几何,反之亦然。在某些边缘情况下,这是不正确的,例如当对父画布的更改导致调整子画布的大小时。

图形(Graphic)是UnityUIC#库提供的基类。它是所有UnityUIC#类的基类,为画布系统提供可绘制几何体。大多数内置UnityUI图形都是通过MaskableGraphics子类实现的,这样就可以通过不可屏蔽的接口对它们进行屏蔽。Drawable的主要子类是图像和文本,它们提供了它们的同名组件。

布局(Layout) 组件控制RectTransform的大小和位置,通常用于创建需要相对大小或相对内容定位的复杂Layouts Layout 组件仅依赖于RectTransform,并且只影响其关联RectTransform的属性。它们不依赖于图形类,可以独立于UnityUI的图形组件使用。

图形和布局组件都依赖CanvasUpdateRegistry类,这个类在UnityEditor的接口中没有公开。该类跟踪必须更新的布局组件和图形组件的集合,并在相关的画布调用WillRenderCanvases事件时根据需要触发更新。

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

Rendering details(渲染细节)

在UnityUI中组合用户界面时,请记住,由画布绘制的所有几何图形都将在透明队列中绘制。也就是说,由UnityUI生成的几何图形将始终与alpha混合画在一起.从性能的角度来看,要记住的重要一点是,从多边形中提取的每个像素光栅都将被采样,即使它完全被其他不透明的多边形所覆盖。在移动设备上,这种高能级的透支可以迅速超过GPU的填充率容量。

The Batch building process (Canvases) 批量生产过程

批处理构建过程是一个过程,画布将表示其UI元素的网格组合在一起,并生成适当的呈现命令以发送到Unity的图形管道。此过程的结果将被缓存和重用,直到画布被标记为脏为止,每当对其组成网格进行更改时,就会发生这种情况。

画布使用的网格是从附加在画布上的画布渲染器组件中提取的,但不包含在任何子画布中。

计算批次需要按深度对网格进行分类,并检查它们是否有重叠、共享的材料等等。这种操作是多线程的,因此它的性能在不同的CPU体系结构之间通常会有很大的不同,特别是在移动SoCs(通常只有很少的CPU核)和现代桌面CPU(通常有4个或更多的核心)之间。

The rebuild process (Graphics)

重建过程是重新计算UnityUI的C#图形组件的布局和网格的地方。这是在CanvasUpdateRegistry类中执行的。记住,这是一个C#类,它的源代码可以在 Unity’s Bitbucket.

在CanvasUpdateRegistry中,感兴趣的方法是PerformUpdate。每当画布组件调用WillRenderCanvases事件时,都会调用此方法。每帧调用一次此事件

PerformUpdate运行三个步骤:

  • 脏布局组件被请求重新构建它们的布局,通过 ICanvasElement.Rebuild method.
  • 任何已注册的裁剪组件(如掩码)都被请求裁剪任何剪裁组件。这是通过ClippingRegistry.Cull完成的。
  • 脏污的图形组件需要重建它们的图形元素。

对于布局和图形重建,流程被分成多个部分。布局重构分三个部分运行(PreLayout、Layout和PostLayout),而图形重构运行在两个部分(PreRender和LatePreRender)。

Layout rebuilds

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

为此,UnityUI根据脏布局组件在层次结构中的深度对其列表进行排序。层次结构中较高的项(即具有较少的父转换)被移到列表的前面。

然后请求布局组件的排序列表来重新构建它们的布局;这就是由布局组件控制的UI元素的位置和大小实际上被更改的地方。有关各个元素的位置如何受布局影响的详细信息,请参阅“Unity Manual”的 UI Auto Layout

Graphic rebuilds

在重建图形组件时,UnityUI将控制传递给ICanvasElement接口的重构方法。图形实现了这一点,并在重新生成过程的PreRender阶段运行两个不同的重建步骤。

  • 如果顶点数据已标记为脏(例如组件的RectTransform更改大小时),将重建网格。
  • 如果材料数据被标记为脏(例如,当组件的材料或纹理被更改时),那么附加的画布渲染器的材料将被更新。

图形重建不按任何特定顺序通过图形组件列表,也不需要任何排序操作。

官方译文,未完待续

猜你喜欢

转载自blog.csdn.net/Momo_Da/article/details/93530301