Unity UI 优化最佳实践6 其他优化技术和小技巧

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

RectTransform-based Layouts

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

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

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

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

Disabling Canvases

在显示或隐藏UI中分离的各部分时,通常在UI的根部启用或禁用GameObject。这可以确保禁用的用户界面中没有组件接收输入或Unity回调。

但是,这也会导致Canvas放弃其VBO数据。重新启用画布将需要画布(以及任何子画布)运行重建和重新分批过程。如果这种情况频繁发生,CPU使用率的增加可能会导致应用程序的帧速率变差。

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

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

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

为了避免这个问题,将以这种方式禁用的UI上的MonoBehaviours不应该直接实现Unity的生命周期回调,而应该从UI的根GameObject上的“Callback Manager” MonoBehaviour接收它们的回调。只要显示/隐藏UI,就可以通知此“Callback Manager”,并且可以确保生命周期事件根据需要传播或不传播。这个“Callback Manager”模式的进一步解释超出了本指南的范围。

Assigning Event Cameras

如果使用Unity的内置输入管理器以及设置为在World Space 或 Screen Space–Camera模式下渲染的Canvases,则始终分别设置事件相机或渲染相机属性非常重要。 从脚本开始,它始终作为worldCamera属性暴露出来。

如果此属性未设置,Unity UI将通过使用Main Camera tag查找附加到GameObjects的Camera组件来搜索Main Camera。 对于每个World Space或Camera Space的Canvas,此查找至少会发生一次。 由于GameObject.FindWithTag的速度很慢,因此强烈建议所有的World Space和Camera Space的Canvases都在设计时或初始化时分配其Camera属性。

Overlay Canvases不会出现此问题。

UI源代码自定义

UI系统被设计为支持大量的用例。 这种灵活性非常好,但这也意味着在不破坏其他功能的情况下不能轻松完成一些优化。 如果您最终遇到可以通过更改C#UI源代码节省一些CPU周期的情况,可以重新编译UI DLL并覆盖Unity自带的那个。 编译方法记录在Bitbucket仓库的的readme文件中。 确保获得与您的Unity版本相对应的源代码。

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

翻译自:https://unity3d.com/cn/learn/tutorials/topics/best-practices/other-ui-optimization-techniques-and-tips?playlist=30089