简单模式和组合模式的兰亭黑字体对比结论
先给数据对比和结论会让文章显得更有价值。
简单模式的兰亭黑字体(GBK编码),7MB,才22026个字,如下两图。
简单模式的兰亭黑字体,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。
至于性能差异不大的原因个人推测主要两个:
-
在Unity中文字运行时都是bake到纹理进行展示的。
某个时刻被bake到运行时纹理里的文字 - 简单模式组合模式的消耗主要集中在矢量转位图,至于组合模式的部件索引、部件偏移这两个额外处理,可以实现得几乎可以忽略不计。
网友评论
我们使用微软雅黑,2.9M。
转换的话用的什么工具,现成的话到哪里可以找到。
我用FontCreator看了几个字库没发现“合成字形属性”面板,这表示这个字库不是“组合模式”吧?
在线等~~~
比如『排』,可以由字库中的『扌』和『非』两个独立文字组成,但是『扌』和『非』组合成『排』的过程,子部件可能需要进行位置及大小的调整,并且每一种字体中子部件具体调整值可能不一样。
按照FontCreator的文档中说明定义文字组合方式的数据在CompositeData.xml中,请问有无机器的方式针对具体字体生成CompositeData.xml,或者是否方便透露本文中兰亭黑字体的CompositeData.xml是怎样的生产流程,谢谢。