本次更新,解決了:定製多樣化問題,並優化了軟體啟動速度。
定製需求:
隨著開發群的日益壯大,有想法的開發者層出不窮;倒是群主太過正常,顯得跟大家有點格格不入了。大家需求是這樣的:
- 我的硬體,沒有framebuffer(這種情況在記憶體較小的微控制器平臺很常見),但我也想用GuiLite畫出漂亮流暢的效果
- 我需要一個可以滾動的UI效果,介面上的所有元素(視窗)可以一起上下左右滑動(例如:手機通訊錄)
- 我需要一個半透明的視窗,其中視窗的背景是半透明的,文字則是不透明的
- 我的硬體有2D加速功能,需要GuiLite給與支援
軟體方案:
以上任何一個要求都足以推倒原有框架,因為太過底層,一旦修改就是對基礎關鍵部分的手術。如何用最少的程式碼簡單粗暴的解決問題,不傷執行效率,又不傷結構,是對軟體架構的一個重大考驗。我們的方案如下:
- 對於有經驗的開發者來說,這已經是舊聞了,不僅被解決了,而且已經廣泛應用在微控制器方案中了;為什麼舊事重提,就是因為它與需求2、3、4有很大的相似性,有必要一起做個總結:從c_surface派生一個類c_surface_no_fb,主要的繪製(渲染)介面沒有變,只是重新實現draw_pixel, fill_rect(過載虛擬函式),讓其透過條用外部的畫點驅動函式,進行具體畫點工作,具體見display.cpp::c_surface_no_fb
- 從c_surface派生一個類c_surface_scroll,擴大surface的高度,寬度,使其能夠繪製所有的視窗元素;混動顯示的過程,就是設定x,y座標偏移量的過程,具體見:HelloScroll/UICode/scroll.h
- 從c_surface派生一個類c_surface_transparent,主要的繪製(渲染)介面沒有變,但實現繪製過程中,分析顏色的alpha值,從而達到透明效果(過載虛擬函式),具體見:HelloTransparent/UICode/surface_transparent.h
- 從c_surface派生一個類c_surface_2d_acc,重新實現一下draw_pixel,fill_rect介面,在該介面裡面使能硬體2D加速功能
最佳化需求:
- Linux版本的例項,看到介面的時間較慢,需要最佳化
- STM32版本,由於有呼叫malloc的地方,所以,在heap size不夠的時候會宕機,需要手動設定heap size;該操作有些麻煩,影響移植體驗,建議最佳化
最佳化方案:
- 去掉一些不必要的同步操作,改為非同步執行,保證介面第一時間呈現出來
- 對例項程式碼進行幾行程式碼調整,用靜態變數代替動態分配
開發者優秀作品展示:
(硬體配置:ESP32 + ST7789 + SPI螢幕),由於GIF的原因,畫面不能像真實影片那麼流暢,更好的效果,可以參看qq群檔案。
感謝GuiLite開發群“李子木”同學的分享!雖然這個作品中能看到GuiLite例項的影子,但視覺效果和藝術設計上面,已經完全是暴捶原作的水準了。特別是對SPI螢幕的DMA最佳化,讓畫面超出想象的流暢,絕對是SPI螢幕的最佳化典範。
最後,希望能看到更多優秀的作品,我們會盡力為大家提供一些技術建議,為您的超神之路貢獻綿薄之力。