Unity文档——其他UI优化技巧和提示

其他UI优化技巧和提示

版本检查:2017.3

-

难度:高级

 

有时,没有简洁的方法来优化UI。本节包含一些可能有助于提高UI性能的建议,但有些建议在结构上“不干净”,可能难以维护,或者可能具有难看的副作用。其他可能是用于简化初始开发的UI中的行为的变通方法,但也使得创建性能问题相对简单。

基于RectTransform的布局

布局组件相对昂贵,因为每次标记为脏时,它们必须重新计算子元素的大小和位置。(有关详细信息,请参阅基础章节的图形重建部分。)如果给定布局中的元素数量相对较少且数量固定,并且布局具有相对简单的结构,则可以使用RectTransform替换布局基于布局。

通过分配RectTransform的锚点,RectTransform的位置和大小可以根据其父级进行缩放。例如,使用两个RectTransforms可以实现简单的两列布局:

  • 左栏的锚点应为X:(0,0.5)和Y:(0,1)
  • 右列的锚点应为X:(0.5,1)和Y:(0,1)

RectTransform的大小和位置的计算将由Transform系统本身在本机代码中驱动。这通常比依赖布局系统更高效。也可以编写MonoBehaviours来设置基于RectTransform的布局。但是,这是一项相对复杂的任务,超出了本指南的范围。

禁用画布

当显示或隐藏UI的离散部分时,通常在UI的根处启用或禁用GameObject。这可确保禁用的UI中的任何组件都不会收到输入或Unity回调。

但是,这也会导致Canvas丢弃其VBO数据。重新启用Canvas将需要Canvas(以及任何Sub-canvases)来运行重建和重新分配过程。如果经常发生这种情况,CPU使用率的增加可能会导致应用程序的帧速率降低。

一种可能但又很糟糕的解决方法是将UI显示/隐藏到其自己的Canvas或Sub-canvas上,然后仅启用/禁用此对象上的Canvas组件。

这将导致UI的网格不被绘制,但它们将保留在内存中并且将保留其原始批处理。此外,不会在UI的层次结构中调用OnEnableOnDisable回调。

但请注意,这不会禁用隐藏UI中的任何MonoBehaviours,因此这些MonoBehaviours仍将接收Unity生命周期回调,例如Update。

为了避免这个问题,将以这种方式禁用的UI上的MonoBehaviours不应该直接实现Unity的生命周期回调,而应该从UI的根GameObject上的“回调管理器”MonoBehaviour接收回调。无论何时显示/隐藏UI,都可以通知此“回调管理器”,并且可以确保生命周期事件在必要时传播或不传播。有关此“回调管理器”模式的进一步说明超出了本指南的范围。

分配事件相机

如果将Unity的内置输入管理器与Canvases一起设置为在World SpaceScreen Space - Camera模式下渲染,则始终分别设置Event Camera或Render Camera属性非常重要。从脚本开始,它始终显示为worldCamera属性。

如果未设置此属性,则Unity UI将通过查找使用Main Camera标记附加到GameObjects的Camera组件来搜索主摄像头。每个World Space或Camera Space Canvas至少会发生一次此查找。由于已知GameObject.FindWithTag较慢,因此强烈建议所有World Space和Camera Space画布在设计时或初始化时分配其Camera属性。

Overlay Canvases不会出现此问题。

UI源代码自定义

UI系统旨在支持大量用例。这种灵活性很棒,但这也意味着在不破坏其他功能的情况下无法轻松完成某些优化。如果最终处于可以通过更改C#UI源代码获得一些CPU周期的情况,则可以重新编译UI DLL并覆盖Unity附带的DLL。此过程记录在Bitbucket存储库的自述文件中。确保获得与Unity版本对应的源代码。

这应该只是作为最后的手段,因为有一些重要的缺点。首先,您必须找到一种方法将此新DLL分发给开发人员和构建计算机。然后,每次升级Unity时,都必须将更改与新的UI源代码合并。确保在进入该方向之前,不能只扩展现有类或编写自己的组件版本。

猜你喜欢

转载自blog.csdn.net/zhaoguanghui2012/article/details/81279801