在嵌入式開發中,字體是嵌入式GUI開發的一個關鍵組件,在理解字體時,我們看到了很多困惑。位圖圖像和渲染圖形之間有什麼區別?文本渲染如何影響內存使用和用戶體驗的質量?
字體渲染的工作原理
如果你考慮一個呈現在計算機屏幕上的字符串,這個字符串只是代表每個字符的單個字形的集合。它們本質上是迷你圖像,但它們的編碼方式與在PNG圖像文件中看到的不同。對於字體文件,只需要在運行時將其渲染為迷你圖像所需的數據。
字體文件格式
對於常規圖像,有多種格式,包括PNG、JPEG和位圖。對於字體,有一大堆不同的格式。嵌入式系統的兩種主要類型是:由蘋果開發的TrueType和由微軟和Adobe聯合開發的OpenType。兩種字體文件格式都只包含字體的數據-如果文件中也包含字形的圖像,那麼字體文件將非常龐大。
從字體文件到屏幕
在嵌入式開發中,由於字體文件只包含原始數據,因此GUI應用程序通常需要字體引擎來呈現字體。字體引擎從文件中提取數據,並在運行時在內存中構造字形(迷你圖像),然後將其推送到顯示器。
當字體第一次渲染時,最好將結果緩存在內存中,以便下次需要使用時,應用程序可以從內存中獲取它,而不必從頭開始計算字形數據。
![](http://daogezhiyuan-article.oss-cn-beijing.aliyuncs.com/win3000/pic/0c68281f-5b11-4486-8197-680d814d9062.jpg)
緩存和預渲染字體
緩存的使用可以追溯到圖像和字體之間的相似性。以同樣的方式,我們必須解碼壓縮圖像格式,如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級別,看看節省了多少空間。然而,較低的級別會降低字體的清晰度,所以最好在模擬器或硬件上驗證結果,看看哪種阿爾法最適合你的用戶體驗。
![](http://daogezhiyuan-article.oss-cn-beijing.aliyuncs.com/win3000/pic/73254de6-c5b2-4697-a83b-69e9483e8de4.jpg)
不同字體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中的圖像設計元素。
文章為用戶上傳,僅供非商業瀏覽。發布者:Lomu,轉轉請註明出處: https://www.daogebangong.com/zh-Hant/articles/detail/Embedded%20Development%20What%20font%20type%20should%20I%20use%20in%20an%20embedded%20GUI%20project.html
评论列表(196条)
测试