繼上篇《基于MCU平臺的HMI開發的性能優化與實戰(上)》深入探討了提升MCU平臺HMI開發效率和應用性能的策略后,本文將專注于NXP i.MX RT1170 MCU平臺的儀表盤開發實踐。我們將重點介紹Qt for MCUs的優化技巧,展示如何通過實際案例應用這些策略,以實現高效且性能卓越的HMI解決方案。
NXP的i.MX RT1170是一款高性能雙核MCU,集成1GHz Arm Cortex-M7和400MHz Cortex-M4內核,提供2MB SRAM和高級安全功能。它支持多種媒體功能和實時性能,適用于消費電子、工業和汽車應用。
上圖展示的HMI儀表設計圖融入了豐富元素,如實時速度、導航、車輛與電池狀態,以及偽3D效果、動態車道線和多圖層圖像疊加等。這些設計在MCU平臺上的精確實現,對HMI的高保真呈現構成了挑戰。
我們將深入探討這一設計在實際開發中的應用策略。通過實施9項關鍵優化,顯著降低了資源消耗并增強了程序性能,確保了MCU平臺上動畫的流暢性,從而提升了用戶體驗。
-
復用一個Text文本框達到多個Text的顯示效果
UI設計中有許多文字部分,比如說像上圖所示的能耗部分的文字顯示,從常規思維來說 “XXX km”、“XXX wh/km”和“XX.X Kmh”三部分因為數字和單位的文字大小不一樣,通常會用6個Text元素實現,但是會增加文本布局的計算開銷,因此我們復用一個Text文本框以達到和多個Text相同的顯示效果,避免多次針對文本的布局計算。
- ?烘焙素材,考慮素材之間的層疊關系
?在HMI開發中,為避免速度表動畫因多圖疊加導致的性能問題,我們優化了素材的層疊處理。原先通過五張圖疊加實現的動效,因頻繁像素計算而造成動畫卡頓。我們對方案進行了改進,將指針、內外光暈合并為一張圖,并僅使用上半部分。通過調整旋轉中心,實現指針轉動效果,這樣既減少了圖像處理的計算量,也降低了素材數量,有效節約了資源,提升了動畫流暢度。
-
圖片素材優化
UI設計給出的圖片資源中有些圖片規格很大,然而并不是整張圖片的內容都會被用到,但是沒有用到的圖片內容在運行時也進行了像素計算,這部分計算就是多余的資源開銷,此時我們就需要對圖片進行剪切,將不需要的圖片內容剪裁掉,避免資源浪費。
-
降低圖片編碼渲染格式
在UI設計中,我們根據圖片的像素精細度需求,為它們分配了不同的編碼渲染格式。例如,對于像素要求較低的純色圖像,我們采用ARGB4444格式;而對于細節豐富、色彩復雜的圖像,則使用ARGB8888格式以保證質量。更多細節,請參考上一期的詳細解析。
- ?使用PathSVG來替代部分圖片
?PathSVG 是一個 SVG (Scalable Vector Graphics) 文件中的元素,通常用于定義矢量圖形的路徑。SVG 是一種基于 XML 的文件格式,用于描述二維矢量圖形。Path 元素是其中最重要和最常用的元素之一,可以用來繪制任意形狀的路徑,如直線、曲線和復雜的多邊形。如上圖所示為能耗突變的矩形框,我們可以使用PathSVG繪制矩形框,使用Gradient實現矩形框內顏色漸變,減少了圖片渲染。
- ?數字動畫替代Timer
?儀表界面上有許多數值是隨著時間變化而不斷變化的,通常我們會綁定value,通過調用Timer不斷改變value的數值,實現界面數據變化,但當Timer正在運行且其屬性之一發生更改時,經過的時間會被重置,發生“臟事件”檢查,占用大量CPU,所以我們使用NumberAnimation代替Timer,增加運行性能。
-
優化Text寫法
如下表所示,優化前相當于在設置字體相關屬性之前先使用了一個Qt.font對象,隨后又對其進行數值修改,優化后相當于直接構建一個自定義的Qt.font對象。這樣的操作減少了多余的計算開銷,在同時存在多個Text而且Text屬性需時刻相同時效果尤為明顯。
-
編譯器優化
編譯器優化是一個復雜的領域,它使用了一系列的技術和策略,可以在保持程序語義不變的情況下,提高程序的運行速度并減小可執行文件的大小。同時編譯器提供多個優化級別,允許開發人員在性能和可維護性之間進行權衡,例如,GCC和Clang等編譯器提供了如下的優化級別:
- O0:無優化,默認的優化級別,編譯器不執行任何優化。
- O1:基本優化,執行一些基本的優化操作,如刪除未使用的變量、內聯簡單函數等。
- O2:中級優化,進行了更多的優化操作,包括更大范圍的內聯、循環展開、函數調用圖優化等。
- O3:高級優化,進行了更深入的優化操作,如更大范圍的內聯、循環變形、自動向量化等。
在MCU儀表的開發中,我們采用Ofast編譯模式以確保程序運行效率最大化。Ofast模式通過結合-O3和-ffast-math的優化特性,提供了一種極端的優化設置。這種設置能夠充分利用CPU的多核和向量化指令集等硬件特性,顯著提升程序的執行速度。盡管使用這種模式會增加程序的編譯時間,但為了性能考慮這種取舍是必要的。
-
啟用圖片資源壓縮
當處理圖片顯示時,MCU會先將圖片數據從外部ROM復制到外部RAM,經過縮放、旋轉等處理后復制到圖像緩沖區中,其中外部ROM->外部RAM的步驟會消耗大量的運行時間,影響程序運行速度,為解決此問題,我們配置了以下三個參數:
resourceCachePolicy
配置resourceCachePolicy: “OnDemand”啟用圖像緩存,此時,圖像在首次加載并使用后,并不會立刻被釋放,而是保存在一個專門的緩存空間內,在下次使用時將直接從緩存中拿取,避免了重復加載圖像帶來的時間開銷。
maxResourceCacheSize
設置maxResourceCacheSize: xxxxxxxx可配置最大緩存空間。
resourceCompression
配置resourceCompression: true則可以啟用對圖像的資源壓縮,盡可能的減小圖像體積,節省外部ROM空間。
應用這些優化策略后,我們能夠在NXP1170平臺上高效地實現并流暢運行UI設計。
若您希望獲取完整的Demo源代碼或深入了解Qt for MCUs,請隨時聯系我們或將需求發送至market@dotrustech.com。