在嵌入式開發(fā)中,字體是嵌入式GUI開發(fā)的一個關(guān)鍵組件,在理解字體時,我們看到了很多困惑。位圖圖像和渲染圖形之間有什么區(qū)別?文本渲染如何影響內(nèi)存使用和用戶體驗的質(zhì)量?
字體渲染的工作原理
如果你考慮一個呈現(xiàn)在計算機屏幕上的字符串,這個字符串只是代表每個字符的單個字形的集合。它們本質(zhì)上是迷你圖像,但它們的編碼方式與在PNG圖像文件中看到的不同。對于字體文件,只需要在運行時將其渲染為迷你圖像所需的數(shù)據(jù)。
字體文件格式
對于常規(guī)圖像,有多種格式,包括PNG、JPEG和位圖。對于字體,有一大堆不同的格式。嵌入式系統(tǒng)的兩種主要類型是:由蘋果開發(fā)的TrueType和由微軟和Adobe聯(lián)合開發(fā)的OpenType。兩種字體文件格式都只包含字體的數(shù)據(jù)-如果文件中也包含字形的圖像,那么字體文件將非常龐大。
從字體文件到屏幕
在嵌入式開發(fā)中,由于字體文件只包含原始數(shù)據(jù),因此GUI應(yīng)用程序通常需要字體引擎來呈現(xiàn)字體。字體引擎從文件中提取數(shù)據(jù),并在運行時在內(nèi)存中構(gòu)造字形(迷你圖像),然后將其推送到顯示器。
當(dāng)字體第一次渲染時,最好將結(jié)果緩存在內(nèi)存中,以便下次需要使用時,應(yīng)用程序可以從內(nèi)存中獲取它,而不必從頭開始計算字形數(shù)據(jù)。
緩存和預(yù)渲染字體
緩存的使用可以追溯到圖像和字體之間的相似性。以同樣的方式,我們必須解碼壓縮圖像格式,如PNG或JPEG,我們需要一個本地緩存來處理字體字形。
在嵌入式開發(fā)中,緩存數(shù)據(jù)使用RAM,但如果你的硬件沒有足夠的空間,你可以決定在運行前預(yù)渲染字形圖像,并將其存儲在應(yīng)用程序中包含的位圖圖像中。通過這種方式,你的應(yīng)用程序可以直接從Flash或存儲中提取字體,而不會占用寶貴的RAM周期。換句話說,字體字形不需要任何內(nèi)存——字體引擎直接從存儲設(shè)備中提取。
需要注意的是,位圖圖像只是alpha數(shù)據(jù),因此如果你想對字體進(jìn)行著色,則需要存儲將字形圖像或迷你圖像渲染到屏幕上所需的alpha值。
預(yù)渲染具有節(jié)省RAM和解壓縮和渲染字體字形的計算成本的優(yōu)點,但缺點是位圖所需的存儲空間。
涉及字體質(zhì)量時需要考慮的3個因素
1.嵌入式開發(fā)團隊正在創(chuàng)建的嵌入式GUI類型
2.正在使用的字體大小
3.正在使用的字體類型
例如,如果你的團隊試圖通過預(yù)渲染字體來節(jié)省存儲空間,那么將在質(zhì)量上進(jìn)行權(quán)衡。如果你從8位到4位alpha,你可能不會看到太多的折衷,但當(dāng)你從2位到1位時,會有顯著的質(zhì)量折衷。
預(yù)渲染字體時節(jié)省空間的技巧
1.為alpha映射存儲較少的位
嵌入式開發(fā)團隊在預(yù)渲染期間節(jié)省存儲空間的第一種方法是為alpha映射存儲更少的位。你可以嘗試4位、2位和1位alpha級別,看看節(jié)省了多少空間。然而,較低的級別會降低字體的清晰度,所以最好在模擬器或硬件上驗證結(jié)果,看看哪種阿爾法最適合你的用戶體驗。
不同字體alpha級別的比較
我們比較了不同位深度的視覺效果。左上角是由字體引擎渲染并存儲在內(nèi)存中的TrueType字體,沒有預(yù)渲染。其他結(jié)果顯示了8位、4位、2位和1位預(yù)渲染位圖場景。
使用1位深度,你失去了一些清晰度,并在C、O或Q等圓形字符周圍引入字體的鋸齒感。本質(zhì)上,這是1位編碼的結(jié)果,只給你一個“開或關(guān)開關(guān)”,你要么畫那個像素,要么不畫?這使得繪制圓邊或圓變得非常棘手。
在一個8位的場景中,你有255個alpha值,允許在整體結(jié)果中有很好的圓角和平滑度。
TTF和8位alpha有什么區(qū)別?
TTF和8位方案之間沒有區(qū)別。它們是完全等效的,因為TTF生成8位alpha圖。當(dāng)字體引擎從字體文件中讀取數(shù)據(jù)并創(chuàng)建象形文字圖像,它實際上是創(chuàng)建一個特定的8位alpha圖字形,非常類似于預(yù)渲染版本。
當(dāng)談到較小的字體或文本時,在某些情況下,你會看到圖像質(zhì)量損失或下降。在嵌入式開發(fā)中,質(zhì)量損失取決于你的嵌入式用戶界面、你使用的字體大小以及你使用的字體類型。它根據(jù)你希望在GUI中發(fā)生的事情而變化。
2.盡量減少字符數(shù)以減少空間
減少存儲空間的第二種方法是最小化字符數(shù)。字體伴隨著大量的字符,或者大量的占星學(xué)上所用的速記符號但是你的用戶界面實際上可能并不需要它們。
如果你將恒溫器作為嵌入式GUI項目,你不需要使用所有的字符——例如,只需要0到9。這意味著你可以剝離未使用的占星學(xué)上所用的速記符號只預(yù)先渲染和存儲這十個字符。
使用開源工具,比如FontForge,允許你瀏覽和修改字體,創(chuàng)建自己的字體,并在字體文件中取出你不需要的內(nèi)容。
這只有在你事先確切知道哪些字符是必需的情況下才有效。在嵌入式開發(fā)中,如果你沒有知道你在處理什么樣的文本,或者如果你有一個文本或磅值經(jīng)常變化的動態(tài)圖形用戶界面,你必須提前渲染,因為應(yīng)用程序在運行之前不知道它需要什么。
嵌入式GUI開發(fā)項目的字體優(yōu)化
在運行時優(yōu)化字體時,位圖字體比通過引擎渲染要快得多,因為沒有預(yù)先計算的階段。加載時間和內(nèi)存查找要快得多。
在運行時字體渲染和預(yù)渲染位圖之間進(jìn)行選擇的快速經(jīng)驗法則:你有更多的Flash還是更多的RAM?
如果你有更多RAM:使用字體引擎渲染場景
如果你有更多的Flash:使用預(yù)渲染位圖場景
需要考慮的一個問題是整體的用戶體驗設(shè)計。它需要大量的動態(tài)字體和大小嗎?如果是這樣,字體引擎方法可能是你更好的策略。
如果你的嵌入式GUI項目在整個用戶界面中使用動態(tài)文本,例如使用國際化語言、各種字體類型或一般動態(tài)行為,則無法對其進(jìn)行預(yù)渲染。如果是這樣,最好的方法是使用字體引擎。在使用字體引擎時,你將希望使用緩存屬性來限制RAM的數(shù)量,以便仍然可以容納小型嵌入式設(shè)備。
結(jié)論
最終,在嵌入式開發(fā)中,用于嵌入式GUI開發(fā)的字體是靈活的,并且類似于圖像。字體不僅用于文本,還用于嵌入式GUI中的圖像設(shè)計元素。