简述字体渲染的流程

给大家普及下字体渲染到画面/屏幕的过程。

有时候你会发现,虽然你为某一段文字指定了字体,但这些文字并没有全部按照该字体显示,其中有一部分显得参差不齐,甚至变成豆腐块。这个时候不要慌,先来了解一下字体渲染的相关机制,那么你也许就知道该如何解决这些问题了。

大部分字体渲染器,在渲染字体时,先看你有没有为当前文本指定字体,如果指定了,则A,如果没指定则B。

A:尝试在系统里寻找指定的字体,如果找到了,则A1,如果找不到则B。

A1:尝试用用该字体显示文本里的所有字符。如果全都可以显示,则渲染结束,如果无法全部显示(文本里出现了该字体不包含的字形),则A2。

A2:从系统里寻找能够显示剩余字符的其它字体,直到找到为止,用找到的字体显示这些字符。那么这些字符的显示效果将会与A1不同,显得参差不齐。

B:尝试使用系统默认字体显示全部字符。如果全都可以显示,则渲染结束,如果无法全部显示(文本里出现了该字体不包含的字形),则B1。

B1:从系统里寻找能够显示剩余字符的其它字体,直到找到为止,用找到的字体显示这些字符。那么这些字符的显示效果将会与B不同。

C:如果上述流程都无法显示的字符,显示为方块。


对应解决方法:

A1:由于该字体包含的字形数量有限,所以只能更换为包含更多字形的字体,才能使整段文字显示效果一致。

B1:先为你的文字指定字体,后同A1。

C:为你的系统安装一些新的字体,尽量选用超大字符集的字体,以确保该字体可以显示尽可能多的字形。


推荐的超大字符集中文字体:

  • NotoSansCJK 也叫做思源黑体(免费可商用)
  • NotoSerifCJK 也叫做思源宋体(免费可商用)
  • 方正字库中有一些超大字符集字体,但商业可能需要付费