在之前文章中,講述了一個低內存使用量的的窗口切換機制。有人會問,低內存使用量是多低呢,我這里舉個例子。我有一個項目中使用到本切換機制,128*64的單色屏,初步計算有105個窗口(后面還會增加),總內存使用量(包括任務棧)=105*3*4(窗口樹) + 1024(公共buff) + 512(任務棧) + 1024*3(uCGUI動態內存) = 6k左右。從這個數字可以看出內存算是使用比較少的了。畢竟有100多個窗口,我在設計時也就只做了10多個窗口,這100多個窗口就是由10多個窗口大量復用組合得到的。
當然本切換機制只是給讀者提供一個靈感,不一定就按筆者的框架來做項目,可以只使用這種思想打造更優秀的架構。畢竟項目千差萬別,本架構更適合使用按鍵來切換窗口的用戶,低內存的用戶,窗口深度級深及多的用戶。
在前一篇文章中有讀者留言,問了很多問題,之前的窗口確實有很多不完善的地方。這里我直把以前的工程進行升級,主要完善原工程中缺失部分。更新內容主要如下:
1,增加高級窗口(突發事件窗口)切換代碼。
2,增加多語言支持接口。
3,接口變更,去除之前繁瑣的外部調用接口。
這里還要講點本機制的特點,本切換機制只進行在一個任務中,也就類似一個大while(1)循環,這樣的操作有他特有的優點,第1可以共有一個大公共buff而不用擔心內存互斥問題。這時一定會有朋友會問,外部任務調用時如何操作呢?這里我把供外部調用的接口統稱為“外部調用接口”。“外部調用接口”我之前的處理方式是,外部任務調用gui內部函數時,把gui內部的函數指針及參數部分同時存入隊列中,直到gui運行到讀隊列時,運行這些函數。這樣就可以很好解決互斥問題。后來我發現,這種方式過於繁瑣,以至於有大量的函數需要進行注冊。現在做了一定修改,只把要傳遞的參數保存在中間變量中,gui運行時查詢是否有參數變更,如果有運行變更部分的代碼。這樣大大簡化了程序復雜度,也更容易理解。
有人可能會擔心這窗口機制的移植性問題。這里我要說下,本窗口我在vc,linux,ucos-ii,ucgui-iii等平台都進行過使用,表現都非常良好,做到了一套代碼多平台使用。
中文顯示,我只做了簡單演示,只把三個窗口使用了中文。
工程鏈接:
http://pan.baidu.com/s/1hqoZgAo