浅析UGUI文本优化

字体和文本的常识介绍和优化

长期以来,若使用UGUI自带的Text及相关组件(如Outline)的性能之低下就为人诟病,最有名的替代插件就是TextMeshPro。现在,这个插件将被整合到Unity 2017这个版本中(公告链接)。可能很多项目还没采用这个不成熟的版本,所以我们还是要回过头来说说UGUI的文本和字体优化。

静态字体 vs 动态字体

字体库很大时(例如中文字库),在资源导入窗口应将其设为动态字体以按需加载。在Unity中,动态字体的使用可能存在如下问题:

  • 就算都是字母“A”,若其大小或样式有不同,则还是会生成不同的纹理图。

  • 当用到字库中一个新的字符,那么纹理图会rebuild(如果原来的尺寸塞不下当前的字,会以两倍大小重建纹理图)

解决方法:

  • 对于英文字母这种有限字符集,不要用动态字体。

  • 在初始化的时候预加载常用的字符集,从而减少rebuild次数。利用 Font.RequestCharactersInTexture

制作自定义字体(待完善)

http://blog.sina.com.cn/s/blog_89d90b7c0102vk20.html http://blog.csdn.net/u011643833/article/details/46520073

文本网格(待完善)

文本中的每一个字符是单独的一个面片,而且周围空白的区域还不小,因此容易叠加在别的UI上,造成不良影响。

TextMesh pro好在哪里

介绍带符号距离场

性能敏感点

  • 勿频繁改变Text组件的属性

    • 当text组件本身变化或父节点被 Setactive(true/false) 时,会引发rebuild,有时会对性能造成明显影响。

  • 不要开启Text 中的BestFit

    • 官方原话:在任何情况下都不推荐使用。为了在一定空间内塞满所要展示的字符串,Best Fit会动态改变字体的大小,从上文中我们已经知道,Unity为不同字号的字符生成不同的纹理图,造成极大浪费。而且频繁使用会造成内存碎片。

  • 不要用OutLine组件、shadow组件

    • 实现效率之低、overdraw之高令人发指。

Last updated