基於雙快取的嵌入式畫面系統的設計

2021-05-22 23:22:02 字數 2607 閱讀 3462

這次的嵌入式專案中的畫面,每次遷移的時候總是會發生無法忍受的閃屏。系統中的畫面時基於awt的,考慮下來閃屏主要是以下兩個方面:

1)、畫面生成特別慢,應該是awt中實現的功能太多,影響了畫面生成的效率

2)、畫面重新整理時,總是會先刷背景,再畫內容。由於硬體效能的影響,整個重新整理過程可以看到很明顯的閃屏。

修正案1:

針對以上的疑點1),通過以下兩種途徑來修正:

1)、整個畫面生成後,再顯示到螢幕上。降低畫面生成時的時間消耗對顯示的影響

2)、將生成後的畫面快取,提公升畫面生成的效率。

修改完成後發現,雖然畫面的生成時間有300毫秒左右提公升到70毫秒,但是閃屏依舊。如此看來應該是硬體平台上的awt實現的問題。

修正案2:

重新實現乙個有限功能的畫面系統,在這個畫面系統中最終生成乙個,最後直接畫到畫面上。

1、設計目標

1)、絕對不閃,只是實現50毫秒級的畫面描畫,而不閃屏。

2)、實現業務中所有需要的功能(還好是個嵌入式的系統,畫面不超過40個)。

2)、提供類似於awt的介面,方便業務人員的實裝。

2、畫面系統中的關鍵概念:

mainframe:對應乙個awt的frame,負責畫面中最終描畫,和awt事件的分發。

view:邏輯畫面,所有畫面的基類。

dialog:邏輯對話方塊。本來不需要重新實現dialog,可是jvm實現的dialog總是會影響後面畫面的描畫,並且效率奇低。只能自己做乙個。

panel:所有控制項的容器。view中的控制項管理都會委託給panel。

canvas:畫布,乙個canvas對應乙個bufferedimage,最終畫面的顯示,就是將這個bufferedimage顯示出來。

component:控制項的基類。實現了lable、textfield、button、list、panel、scrollpanel。

3、設計思想

每個view對應乙個canvas,view中的每個控制項的操作都會對映到這個canvas中,提公升畫圖的效率。乙個控制項狀態的變更,不會導致整個view的重繪,而只會重繪這個控制項。但是提供重繪這個view重繪的介面。

畫面的遷移只是view的邏輯遷移,不會導致awt的畫面遷移。

支援panel的巢狀,以方便共同畫面模組的實現。

1、控制項系

類圖所有的控制項都繼承自component,component類實現了所有控制項的共同屬性,如前景背景,字型,可視等等。所有的控制項都必須放在panel中,view中其實就是放了乙個rootpanel。只有實現了scrollable介面的控制項才能放入scrollpanel中,其實最好是panel實現scrollable,而現在的專案裡沒有用到所以就沒有實現。

2、畫面管理系

類圖系統中的可獲得焦點控制項都要實現focusable介面,而view類包含乙個focusable的屬性。乙個畫面只能有乙個控制項獲得焦點,所以我把焦點監聽放到了view中,以方便管理。而整個系統中只有textfield實現了focusable。

系統activable監視滑鼠的壓下事件,這可以使控制項可以在控制項拖動時實現更大的靈活性。比如滾動條,開始滾得時候可能在滾動條上,而托托滑鼠可能就偏了,最為繼續跟蹤這個事件就通過activable來儲存這個控制項。系統中只有滾動條實現了這個介面。

整個系統中只會有乙個mainframe的例項,它負責將view生成的影象描畫到螢幕上,並將畫面上的滑鼠事件傳送給view。由於系統中的畫面不支援 鍵盤,所以不實現鍵盤事件。viewmanagerimp中包含了乙個view和dialog的引用,他們都描畫都會被委託為mainframe。dialog的描畫最終也會委託給view,以防止短時間內畫 面的多次描畫導致的閃屏。

view的初始屬性的設定與遷移共同引數的生成都由viewmanager管理,而view物件的實際生成由viewfactory完成,不過提供了乙個根據類名通過反射生成的例項的預設實現。這裡通過viewmanger和viewfactory把物件的生成與屬性的設定進行分離,以便於擴充套件。

1、將畫布放入到每個控制項中

在現有系統中,所以控制項的描畫都會委託為view中的canvas,這雖然提公升了效能,但是也使得控制項的描畫有許多限制。比如描畫工程只能由控制項自己完成,而不能由上層來控制。如list其實有兩種狀態,一種是直接放到panel中,不需要變更大小。直接描畫就可以;而當其放在scrollpanel中時,則可以改變大小,由scrollpanel來滾動。在現有系統中就需要list區分這兩種行為。而如果是每個控制項都有自己的canvas,那麼父容器就可以選擇做出不同的行為,這個應該更合理,更自由。當然,也是需要一定的效能損耗的。

2、控制項初始化的時機變更

現有系統的空間初始化是與awt類似的,在addcomponent時初始化,這就有很多時機的問題。現在想來還是swt那種直接在建構函式中傳父容器的方式更簡單,方便。

3、mainframe與view的關係

現在是view是mainframe的屬性,其實不需要,view應該有viewmanager完全控制。viewmanager會將view的描畫委託為mainframe。

4、為了提公升畫面更新的效率,考慮引入修改快取的概念

現在的系統是任何乙個控制項的狀態改變都會直接反映到螢幕上,如textfield的輸入等。

當畫面上有多個自主更新的控制項時,並且不希望每個控制項的更新都導致畫面重新整理,這時可以將影象的修改快取,然後再乙個特定時機一起重新整理,當然這個時間間隔必須很小。

基於ARM CLinux嵌入式系統

32位arm嵌入式處理器具有高效能 低軾耗的特性,已被廣泛應用於消費電子產品 無線通訊和網路通訊等領域。clinux是專門為無mmu處理器設計的嵌入式作業系統,支援arm motorola等微處理器。目前國內外採用arm clinux作為嵌入式系統非常普遍。而嵌入式系統的啟動引導技術是嵌入式系統開發...

基於DSP的Bluetooth嵌入式系統應用

藍芽 bluetooth 協議標準是由藍芽特別興趣小組 bluetooth sig 發布的,1999年發布了bluetooth 1.0版,2001年2月發布了bluetooth1.1版。目前sig成員已經發展到3000家左右。藍芽協議規定的無線通訊標準,基於免申請的2.4ghz的 ism頻段,採用g...

基於cubietruck的嵌入式系統移植

apt get install build essential libncurses5 dev deboostrap u boot tools qemu user static git binfmt support libusb 1.0 0 dev pkg config apt get instal...