由于某个需求,我需要了解一下关于字体渲染相关知识,以前没有接触过这个,所以启蒙就只能靠Google了。我先后找到了《认识字体渲染》和《一笔一划间蕴藏的学问 浅谈计算机字体》,有一点明白了,但只是看文章感觉很缥缈。那么我就来根据我自己的理解来实现和总结一下字体的一些概念。
字体种类
常用的是点阵字体和矢量字体,具体见Computer_font。
点阵字体:
后缀名一般为fon或者是C语言头文件形式。看讲字体渲染文章都是吐槽的,但是没有人以身边例子说明一下。它的英语原型为Bitmap fonts,直译过来就是位图字体。所有的字都是一个个的图片。电脑上虽然已经不使用了,但是在其它地方还广泛使用。
它的应用场合有:
1.Linux字符界面
2.Windows启动过程中的字符显示
3.Android的Recovery模式的字符显示 见《Android的Recovery中font_10x10.h字库文件制作》
4.路边商家门头上的滚动LED显示屏
5.工业中常用的12864点阵显示屏
矢量字体:
后缀名一般为ttf。由于点阵字体不方便缩放的特点,就有了矢量字体。但是也会有一些其它问题需要解决,如果锯齿现象。
字体优化
字体的优化是一般包括反锯齿和平滑。这里以比较常用的Win7系统中的雅黑字体来说明。结合Windows的“相对完美”的显示效果以及Linux的“可订制性强”的特点来实验出同一字体在不同的渲染策略中将会呈现什么样的显示效果。
这张Win7系统桌面的部分截图显示的雅黑字体的Windows风格的最佳效果了。如果想要看到反锯齿和平滑的不同参数组合带来的最直接的感受就要到Linux系统下来调整看看了。调试不同的渲染效果一般采用Ubuntu tweak工具来设置调试:
参数中英对照
Font hinting(微调/平滑):
1.No hinting. 无微调
2.Basic 一般
3.Moterate 适中
4.Maximum 最大
Antialiasing(反锯齿_也指渲染策略):
1.No antialiasing 无边缘平滑
2.Grayscale antialiasing 灰度边缘平滑
3.Subpixel antialiasing 次/亚像素平滑
通过调节对比Windows上是Hinting:Maximum和Antialiasing:subpixel antialiasing是达到最好的效果的。
这里也同时看看不现组合带来的不同效果:
极端组合效果:
个人评价:再好的字体不使用好的渲染也是渣。
个人评价:Hinting作用比较大,效果明显。
个人评价:字体模糊/发虚等问题的根本。
个人评价:次像素是目前各个操作系统都在使用的方式,Hinting对字体的显示效果有很大的影响。
小结:字体最终的显示效果和字体的类型以及优化程度同时有很大的关系。是向以清晰为目的的Windows看齐还是以真实为效果的iOS/Android/Ubuntu看齐就要因地制宜了。在万恶的1366x768以及低PPI上显示器上我会选择前者,因为后者真心就是一坨。在今后的Retina显示屏会有第三个选项选择,那就是不再使用次像素反锯齿了。另:有些知识过了很长时间会被串起来的。