在嵌入式开发中,字体是嵌入式GUI开发的一个关键组件,在理解字体时,我们看到了很多困惑。位图图像和渲染图形之间有什么区别?文本渲染如何影响内存使用和用户体验的质量?

字体渲染的工作原理

如果你考虑一个呈现在计算机屏幕上的字符串,这个字符串只是代表每个字符的单个字形的集合。它们本质上是迷你图像,但它们的编码方式与在PNG图像文件中看到的不同。对于字体文件,只需要在运行时将其渲染为迷你图像所需的数据。

字体文件格式

对于常规图像,有多种格式,包括PNG、JPEG和位图。对于字体,有一大堆不同的格式。嵌入式系统的两种主要类型是:由苹果开发的TrueType和由微软和Adobe联合开发的OpenType。两种字体文件格式都只包含字体的数据-如果文件中也包含字形的图像,那么字体文件将非常庞大。

从字体文件到屏幕

在嵌入式开发中,由于字体文件只包含原始数据,因此GUI应用程序通常需要字体引擎来呈现字体。字体引擎从文件中提取数据,并在运行时在内存中构造字形(迷你图像),然后将其推送到显示器。

当字体第一次渲染时,最好将结果缓存在内存中,以便下次需要使用时,应用程序可以从内存中获取它,而不必从头开始计算字形数据。

缓存和预渲染字体

缓存的使用可以追溯到图像和字体之间的相似性。以同样的方式,我们必须解码压缩图像格式,如PNG或JPEG,我们需要一个本地缓存来处理字体字形。

在嵌入式开发中,缓存数据使用RAM,但如果你的硬件没有足够的空间,你可以决定在运行前预渲染字形图像,并将其存储在应用程序中包含的位图图像中。通过这种方式,你的应用程序可以直接从Flash或存储中提取字体,而不会占用宝贵的RAM周期。换句话说,字体字形不需要任何内存——字体引擎直接从存储设备中提取。

需要注意的是,位图图像只是alpha数据,因此如果你想对字体进行着色,则需要存储将字形图像或迷你图像渲染到屏幕上所需的alpha值。

预渲染具有节省RAM和解压缩和渲染字体字形的计算成本的优点,但缺点是位图所需的存储空间。

涉及字体质量时需要考虑的3个因素

1.嵌入式开发团队正在创建的嵌入式GUI类型

2.正在使用的字体大小

3.正在使用的字体类型

例如,如果你的团队试图通过预渲染字体来节省存储空间,那么将在质量上进行权衡。如果你从8位到4位alpha,你可能不会看到太多的折衷,但当你从2位到1位时,会有显著的质量折衷。

预渲染字体时节省空间的技巧

1.为alpha映射存储较少的位

嵌入式开发团队在预渲染期间节省存储空间的第一种方法是为alpha映射存储更少的位。你可以尝试4位、2位和1位alpha级别,看看节省了多少空间。然而,较低的级别会降低字体的清晰度,所以最好在模拟器或硬件上验证结果,看看哪种阿尔法最适合你的用户体验。

不同字体alpha级别的比较

我们比较了不同位深度的视觉效果。左上角是由字体引擎渲染并存储在内存中的TrueType字体,没有预渲染。其他结果显示了8位、4位、2位和1位预渲染位图场景。

使用1位深度,你失去了一些清晰度,并在C、O或Q等圆形字符周围引入字体的锯齿感。本质上,这是1位编码的结果,只给你一个“开或关开关”,你要么画那个像素,要么不画?这使得绘制圆边或圆变得非常棘手。

在一个8位的场景中,你有255个alpha值,允许在整体结果中有很好的圆角和平滑度。

TTF和8位alpha有什么区别?

TTF和8位方案之间没有区别。它们是完全等效的,因为TTF生成8位alpha图。当字体引擎从字体文件中读取数据并创建象形文字图像,它实际上是创建一个特定的8位alpha图字形,非常类似于预渲染版本。

当谈到较小的字体或文本时,在某些情况下,你会看到图像质量损失或下降。在嵌入式开发中,质量损失取决于你的嵌入式用户界面、你使用的字体大小以及你使用的字体类型。它根据你希望在GUI中发生的事情而变化。

2.尽量减少字符数以减少空间

减少存储空间的第二种方法是最小化字符数。字体伴随着大量的字符,或者大量的占星学上所用的速记符号但是你的用户界面实际上可能并不需要它们。

如果你将恒温器作为嵌入式GUI项目,你不需要使用所有的字符——例如,只需要0到9。这意味着你可以剥离未使用的占星学上所用的速记符号只预先渲染和存储这十个字符。

使用开源工具,比如FontForge,允许你浏览和修改字体,创建自己的字体,并在字体文件中取出你不需要的内容。

这只有在你事先确切知道哪些字符是必需的情况下才有效。在嵌入式开发中,如果你没有知道你在处理什么样的文本,或者如果你有一个文本或磅值经常变化的动态图形用户界面,你必须提前渲染,因为应用程序在运行之前不知道它需要什么。

嵌入式GUI开发项目的字体优化

在运行时优化字体时,位图字体比通过引擎渲染要快得多,因为没有预先计算的阶段。加载时间和内存查找要快得多。

在运行时字体渲染和预渲染位图之间进行选择的快速经验法则:你有更多的Flash还是更多的RAM?

如果你有更多RAM:使用字体引擎渲染场景

如果你有更多的Flash:使用预渲染位图场景

需要考虑的一个问题是整体的用户体验设计。它需要大量的动态字体和大小吗?如果是这样,字体引擎方法可能是你更好的策略。

如果你的嵌入式GUI项目在整个用户界面中使用动态文本,例如使用国际化语言、各种字体类型或一般动态行为,则无法对其进行预渲染。如果是这样,最好的方法是使用字体引擎。在使用字体引擎时,你将希望使用缓存属性来限制RAM的数量,以便仍然可以容纳小型嵌入式设备。

结论

最终,在嵌入式开发中,用于嵌入式GUI开发的字体是灵活的,并且类似于图像。字体不仅用于文本,还用于嵌入式GUI中的图像设计元素。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部