首頁 > 易卦

嵌入式開發:在嵌入式GUI專案中應該使用什麼字型型別?

作者:由 學習嵌入式 發表于 易卦日期:2022-11-29

如何把隱藏的資料給弄出來

在嵌入式開發中,字型是嵌入式GUI開發的一個關鍵元件,在理解字型時,我們看到了很多困惑。點陣圖影象和渲染圖形之間有什麼區別?文字渲染如何影響記憶體使用和使用者體驗的質量?

字型渲染的工作原理

如果你考慮一個呈現在計算機螢幕上的字串,這個字串只是代表每個字元的單個字形的集合。它們本質上是迷你影象,但它們的編碼方式與在PNG影象檔案中看到的不同。對於字型檔案,只需要在執行時將其渲染為迷你影象所需的資料。

字型檔案格式

對於常規影象,有多種格式,包括PNG、JPEG和點陣圖。對於字型,有一大堆不同的格式。嵌入式系統的兩種主要型別是:由蘋果開發的TrueType和由微軟和Adobe聯合開發的OpenType。兩種字型檔案格式都只包含字型的資料-如果檔案中也包含字形的影象,那麼字型檔案將非常龐大。

從字型檔案到螢幕

在嵌入式開發中,由於字型檔案只包含原始資料,因此GUI應用程式通常需要字型引擎來呈現字型。字型引擎從檔案中提取資料,並在執行時在記憶體中構造字形(迷你影象),然後將其推送到顯示器。

當字型第一次渲染時,最好將結果快取在記憶體中,以便下次需要使用時,應用程式可以從記憶體中獲取它,而不必從頭開始計算字形資料。

嵌入式開發:在嵌入式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級別,看看節省了多少空間。然而,較低的級別會降低字型的清晰度,所以最好在模擬器或硬體上驗證結果,看看哪種阿爾法最適合你的使用者體驗。

嵌入式開發:在嵌入式GUI專案中應該使用什麼字型型別?

不同字型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中的影象設計元素。