优化UI控件
版本检查:2017.3
-
难度:高级
Optimizing Unity UI指南的这一部分重点介绍特定于某些类型的UI控件的问题。虽然大多数UI控件在性能方面都相对类似,但两个突出显示是接近可发布状态的游戏中遇到的许多性能问题的原因。
UI文字
Unity的内置Text组件是在UI中显示栅格化文本字形的便捷方式。但是,有许多行为不为人所知,但经常被视为性能热点。在向UI添加文本时,请始终记住文本字形实际上呈现为单个四边形,每个字符一个。这些四边形往往在字形周围有大量空白空间,具体取决于其形状,并且很容易定位文本,使其无意中破坏其他UI元素的批处理。
文本网格重建
一个主要问题是重建UI文本网格。每当更改UI文本组件时,文本组件都必须重新计算用于显示实际文本的多边形。如果只是禁用并重新启用文本组件或其任何父游戏对象而不更改文本,也会发生此重新计算。
对于显示大量文本标签的任何UI,此行为都存在问题,最常见的是排行榜或统计屏幕。隐藏和显示Unity UI的最常用方法是启用/禁用包含UI的GameObject,具有大量文本组件的UI通常会在显示时导致不希望的帧速率打嗝。
有关此问题的潜在解决方法,请参阅下一章中的“ 禁用画布”部分。
动态字体和字体图集
当完整可显示字符集非常大或在运行时之前未知时,动态字体是显示文本的便捷方式。在Unity的实现中,这些字体在运行时根据UI Text组件中遇到的字符构建字形图集。
加载的每个不同的Font对象将保持其自己的纹理图集,即使它与另一种字体在同一字体系列中。例如,在一个控件上使用带有粗体文本的Arial,而在另一个控件上使用Arial Bold将产生相同的输出,但Unity将保留两个不同的纹理图集 - 一个用于Arial,一个用于Arial Bold。
从性能角度来看,最重要的是要明白Unity UI的动态字体在字体的纹理图集中为每个不同的大小,样式和字符组合维护一个字形。也就是说,如果UI包含两个文本组件,两个都显示字母'A',则:
- 如果两个Text组件共享相同的大小,则字体图集中将包含一个字形。
- 如果两个文本组件不共享相同的大小(例如,一个是16点,另一个是24点),则字体图集将包含两个不同大小的字母“A”的副本。
- 如果一个Text组件是粗体而另一个不是粗体,那么字体图集将包含粗体'A'和常规'A'。
每当具有动态字体的UI Text对象遇到尚未光栅化为字体纹理图集的字形时,必须重建字体的纹理图集。如果新字形适合当前地图集,则会添加该字形并将地图集重新上传到图形设备。但是,如果当前的图集太小,则系统会尝试重建图集。它分两个阶段完成。
首先,仅使用当前由活动UI文本组件显示的字形重建相同大小的图集。这包括UI Text组件,其父Canv