在Unity项目中的简单模式字体和组合模式字体

C#

浏览数:139

2019-10-11

AD:资源代下载服务

简单模式和组合模式的兰亭黑字体对比结论

先给数据对比和结论会让文章显得更有价值。

简单模式的兰亭黑字体(GBK编码),7MB,才22026个字,如下两图。

简单模式的兰亭黑字体,7MB


简单模式的兰亭黑字体,22026个字,7MB

组合模式的兰亭黑字体(GB18030编码),2MB,共35727个字。如下两图。

组合模式的兰亭黑字体,2MB
组合模式的兰亭黑字体(GB18030编码),2MB,共35727个字

两者的Unity真机Android进行Profile结果,如下两图。


Unity真机Android进行Profile,简单模式的兰亭黑占用内存7MB
Unity真机Android进行Profile,组合模式的兰亭黑占用内存2MB

构建apk包结果,如下两图。

简单模式的兰亭黑占用外存212MB


组合模式的兰亭黑占用外存210MB

真机体验和进行Profile,两者并无明显显示差异、cpu time/gpu time并无明显差别。

结论也就是说,换成组合模式的兰亭黑后,我们多了CJK3国语言,多了10000多个字,却反倒节省了5MB内存和2MB外存!!!

什么是简单模式字体、什么是组合模式字体

简单模式下的每一个字,都以字为单位进行矢量描述。如下图。


简单模式的“侣”字,“侣”字一个整体进行矢量描述

组合模式下的每一个字,会进行部件拆分,以部件为单位进行矢量描述,不同的字公用某些部件。如下图。


组合模式的“握”字,拆分为“提手旁”和“屋”两个部件,每个部件单独进行矢量描述

因为中文出现非常多公用的偏旁部首,所以,部件共享,为中文省下了异常多的矢量描述。

更进一步的具体原理可参考Composite glyphs and functions – Microsoft

至于性能差异不大的原因个人推测主要两个:

  1. 在Unity中文字运行时都是bake到纹理进行展示的。

    某个时刻被bake到运行时纹理里的文字

  2. 简单模式组合模式的消耗主要集中在矢量转位图,至于组合模式的部件索引、部件偏移这两个额外处理,可以实现得几乎可以忽略不计。

作者:DonaldW