UGUI最佳实践(4) - UI 控件优化

UI控件优化

本章主要讨论特定类型UI控件的优化,虽然大多数UI控件在性能方面变化不大,但是有两个控件在项目后期经常会出现性能问题,这两个控件分别是 Text 和 ScrollRect。

UI Text

UGUI内置的 Text 组件可以方便的显示文字,然而,我并不知道它底层的很多行为,这些往往会成为性能的热点,必须记住的一点是,当我们向 UI 添加一个 Text 组件的时候,它会为每个字符创建一个四边形,这些四边形周围存在很多的空白空间,这取决于他的形状大小,这种方式很容易在放置文本的时候中断其他 UI 元素的批处理。

文本网格重构

文本网格重构是一个非常重要的问题,当 Text 组件发生变化时,就需要重新计算各个字符的四边形网格来显示实际的字符串,当Text组件或者父物体从 disable 转换到 enable状态时,即使字符串内容没有发生变化,也会重新进行计算。

这对于那些包含大量 Text 组件的 UI 是有性能问题的,最常见的情况就是排行榜和统计信息面板。显示/隐藏 UI 最常用的方法就是 Enable/Disbale 包含该 UI 的游戏对象,包含大量 Text 组件的 UI 经常会引起帧率的波动。

一个变通的解决方式,可以参考禁用 Canvas

动态字体和字体图集

当整个项目需要显示的字符集非常大,或者在运行之前是未知的,那么动态字体是一种很方便的选择。在运行时,Unity 会将 Text 组件中使用的字符打包到一个字符图集中。每一个加载的字体都会生成自己的字符图集,即使它与另一种字体类型相同,比如,使用 Arial 字体创建一个 blod 类型的 Text,和使用 Arial Bold 字体创建一个 normal 类型的字体,虽然他们最终的效果一样,但是使用的却是不同的字符图集,一个是 Arial、一个是 Arial Bold。

从性能方面考虑,最重要的是要了解,UGUI 为每种字体大小、字体样式、字符维护一个字形,比如:现在有两个 Text 组件,显示内容都是 ‘A’,那么:

  1. 如果两个Text 的字体大小(fontSize)相同,字符图集中只有一个‘A’字形。
  2. 如果两个 Text 的字体大小不一样(一个16,一个24),字符图集将会包含两份‘A’字形的拷贝(一个对应16号字体,一个对应24号字体)。
  3. 如果一个Text 的字体样式是 blod,而另一个是 normal,字符图集将会包含两份‘A’字形的拷贝(一个对应 bold 样式,一个对应 normal 样式)。

每当 Text 遇到字符图集中没有的字符时,都会对字符图集进行重新构建。如果字符图集能够容纳新的字形,就会将它添加到图集中,并将图集重新上传到图形设备,如果字符图集太小不能容纳新字形,系统将会尝试重新构建字符图集,这个过程主要分两个阶段:
第一步,使用相同尺寸重新构建图集,但是只将当前活动的 Text 组件的字形添加到图集中,如果这些字形能够成功添加到图集中,那么第二步就不需要执行了。
第二部,如果第一步执行失败了,说明相同尺寸的图集已经容纳不下需要显示的字符,只能采用更大尺寸的图集,新尺寸 = 当前尺寸 x 2;例如 512 x 512 增大后会变成 512 x 1024 大小。
由于上面的算法,图集尺寸只有在创建的时候才会增大,考虑到图集重构的资源消耗,需要将该过程的消耗降到最低,有两个可用的方法:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值