「Z站推薦」GUI 引擎評價指標
評價一個GUI引擎很難,本文提供了一些重要的評價指標,這些指標可以幫助大家選擇適合自己的GUI,也歡迎大家對AWTK和其它GUI進行對比評估。
github上的開源 GUI 引擎至少有數(shù)十個,如何去評估它們的優(yōu)劣,如何選擇你需要的GUI引擎?這個是艱巨的任務,每個人的需求不一樣,GUI開發(fā)者的意圖也不同,很難找到統(tǒng)一的標準去選出最好的GUI。
QT是最強大的,沒有之一,但也不一定適合你。在這篇文章有句話:“商業(yè)引擎看起來功能很齊全,但是實際使用起來你就知道有多少坑。” 這句話挺有意思,它即適合游戲引擎,也適合GUI引擎。demo看起來很好,技術(shù)看起來很先進,用起來才知道有多少坑!所以事先做一個完整的評估是很有必要的。
雖然客觀的評價一個GUI引擎很難,但不管怎么樣,總有些指標可以提供有價值的參考,盡管這些指標在遇到不同使用的場景,不同的公司背景,不同的個人喜好,它們所占的權(quán)重也大不相同。但是并不能抹殺這些指標的價值,關(guān)鍵在于如何根據(jù)自己的需要調(diào)整它們的比重。
在這篇《這個開源的6千行UI框架,能打敗QT,MFC嗎?》文章里,諸葛不亮的37問給了我極大的啟發(fā),在開發(fā)AWTK的過程中,多次重讀這篇文章,這篇文章堪稱是GUI引擎開發(fā)者的指路明燈。
如果諸葛大俠不介意,為了活躍氣氛,我就把本文提到的指標稱為《諸葛不亮-李先靜 GUI 引擎評價指標》,把諸葛大俠放在前面,是表示對他的感謝,把我的名字放在里面,是由我承擔一些人的指責。
基本指標
1. 開發(fā)者的心態(tài)
當你用他們的 GUI 時,他們是感謝你的支持,還在覺得你欠他們的呢?如果他們沒有心存感謝,你最好別用。否則,遇到問題時,你怎么能指望他們幫你解決呢?
2. 幫助文檔
是否有《API 手冊》、《使用手冊》、《常見問題》、《移植文檔》和《HowTo》,文檔是否在定期更新?
3. 示例代碼
是否有簡單的入門示例、各種控件的的用法、完整功能的示例?
4. 代碼風格
目錄名、文件名、類名、函數(shù)名、函數(shù)參數(shù)、局部變量名、全局變量名、注釋和縮進是否一致。
5. 編程語言
目前支持哪些開發(fā)語言?支持新的開發(fā)語言是否容易?編程風格是否與對應的語言相符?不同語言綁定的代碼能否同步更新(否則很容易落后于核心引擎)?
對于 GUI 引擎來說,支持多種編程語言是重要的,可以滿足不同的開發(fā)者的需要。對于使用者來說,GUI 是否提供了你需要的編程語言才是最重要的。
6. 支持的平臺
對于 GUI 引擎來說,支持多種平臺是重要的,可以滿足不同的開發(fā)者的需要。對于使用者來說,支持多種平臺也是重要的,你現(xiàn)在開發(fā)嵌入式系統(tǒng),過段時間你可能要開發(fā)一個 APP 控制你設備,沒有必要浪費時間去學習不同的 GUI。
GUI 是否支持目標平臺的界面風格,是否提供跨平臺的運行庫,是否對平臺基本的原生功能進行了包裝,能否擴展新的功能。是否支持平臺原生輸入法?
7. 可視化的界面設計工具
所見即所得方式開發(fā)界面可以降低學習門檻,提高開發(fā)效率。
8. 可視化的界面設計工具是否是用該 GUI 本身開發(fā)的
用該 GUI 本身開發(fā)的界面設計工具,可以驗證該 GUI 本身的功能是否強大和穩(wěn)定。
另外用該 GUI 本身開發(fā)的界面設計工具,才能把界面設計工具做得易用。比如 TabControl 控件,在設計時可以切換頁面,只有用該 GUI 本身開發(fā)的界面設計工具才容易實現(xiàn)。
9. 在開發(fā)環(huán)境模擬運行
運行環(huán)境和開發(fā)環(huán)境往往不同, 如果每次都要部署一下才能看到效果,那開發(fā)速度一定上不來。
10. 用 XML/JSON 等數(shù)據(jù)來描述界面
XML/JSON 是聲明式的語法,不但手工編寫比寫程序容易,也方便借助工具的支持。
對于嵌入低端嵌入式系統(tǒng)來說,XML/JSON 效率不高,最好的辦法是運行時轉(zhuǎn)換成高效的二進制格式。就像代碼一樣,編譯之前的代碼給人看,編譯之后的代碼給機器看。
11. 用 XML/CSS 等數(shù)據(jù)來描述界面的風格
XML/JSON 是聲明式的語法,不但手工編寫比寫程序容易,也方便借助工具的支持。
把界面風格從 UI 描述文件和代碼中剝離出來,也有利于后期的維護,畢竟界面效果是最容易變化的。
對于嵌入低端嵌入式系統(tǒng)來說,XML/JSON 效率不高,最好的辦法是運行時轉(zhuǎn)換成高效的二進制格式。就像代碼一樣,編譯之前的代碼給人看,編譯之后的代碼給機器看。
12. 字體格式
支持點陣字體嗎?支持矢量字體嗎?支持自定義字體格式嗎?支持只加載部分字體到內(nèi)存嗎?配套工具完善嗎?
13. 圖片格式
支持常見的 png/jpg/gif/bmp 格式嗎?支持 SVG 等矢量圖形嗎?能擴展支持新的格式嗎?
14. 輸入法
支持拼音輸入法嗎?支持軟鍵盤的 T9 輸入法嗎?支持硬鍵盤的 T9 輸入法嗎?支持語音輸入法嗎?支持手寫輸入法嗎?可以擴展支持新的輸入嗎?是否支持平臺原生輸入法?
15. 基本架構(gòu)模式
是否內(nèi)置提供支持 MVC、MVP 和 MVVM 等架構(gòu)模式?是否支持 Vue、React 和小程序類似的開發(fā)方式?
功能指標
1. 高清屏
是否支持高清屏?在 PC 上運行時界面變糊了,在手機上運行時字體變小了,都是不支持高清屏的特征。不支持高清屏就不用談什么跨平臺了。
2. 矢量圖 API
矢量圖 API 是非常重要的,強大矢量圖 API 能實現(xiàn)很多神奇的效果。個人覺得 html5 Canvas 2D API 是最好的矢量圖 API。用 cairo、skia、agge 和 nanovg 這些開源的庫很容易實現(xiàn)類似的 API。
GUI 一定要提供一個抽象的接口,在不同的情況下,可以無縫的切換到最優(yōu)的實現(xiàn)方案上。比如在嵌入式平臺用 agge,在嵌入式 linux 平臺用 cairo,在 PC 上用 skia 或 nanovg。
3. 窗口動畫
是否支持窗口動畫?窗口動畫的種類是否夠用?是否可以擴展自己的窗口動畫。窗口動畫的效率如何?窗口動畫使用是否方便?
4. 控件動畫
是否支持控件動畫?支持那些控件動畫?是否支持自定義的控件動畫?控件動畫使用是否方便?控件動畫的參數(shù)有哪些?是否可以停止、暫停和播放控件動畫。
5. 內(nèi)置控件是否豐富
是否有日歷選擇控件?是否有文件選擇控件?是否有顏色選擇控件?是否有 RichText 控件?是否有你目前需要的控件和將來可能用到的控件?
6. 控件組合是否方便
有的 GUI 把控件分成葉子節(jié)點控件和容器控件,label、image、edit 和 button 都是葉子節(jié)點控件。這樣做靈活性很差,往 button 放個圖片或者動畫,往 label 里放個圖片,往 edit 里放一個"清除"/"查找"的 button,不是方便的事嗎,為什么要限制呢?
7. 自定義控件
沒有一個 GUI 能夠滿足所有的需求,如果不支持自定義控件就悲催了。這樣一個簡單的需要,在有的 GUI 里卻需要修改 GUI 引擎的代碼,那就不好玩了。
8. 布局 (layout) 參數(shù)
通過布局參數(shù)控制控件布局,可以讓應用程序適用于不同大小的屏幕。是否支持布局參數(shù),布局功能是否強大,是否可以擴展自定義布局?
9. 控件自定義屬性
如果控件支持自定義屬性,用戶可以存放自己的數(shù)據(jù)到控件中,可以避免使用全局變量,是個極為方便的特性。
如果控件支持自定義屬性,對 GUI 進行擴展也很方便,比如 AWTK-MVVM 的綁定規(guī)則就使用了用戶自定義屬性,如果將 AWTK-MVVM 移植到 Qt 就很容易,因為 Qt 也支持自定義屬性,要移植到 emwin 就麻煩不少。
10. 控件:label
label 是最簡單的控件,要做好也不容易。就像炒飯是廚師的基本功一下,label 就是 GUI 開發(fā)者的基本功。 支持 style(字體、顏色和對齊等各種參數(shù))嗎?支持 unicode 的換行規(guī)則嗎?支持滾動顯示嗎?支持省略號顯示嗎?支持 bidi 算法嗎?支持動畫(比如打字效果和撥號中那種)。滾動顯示支持得到焦點時才滾動嗎?支持垂直方向排版嗎?
當然把 label 和 scroll_label 分成兩個控件好點,實現(xiàn)簡單而且在低端平臺無需支持一下不必要的特性。總之,用戶需要時就要有這些功能。
11. 控件:image
支持旋轉(zhuǎn)和縮放嗎? 支持旋轉(zhuǎn)和縮放動畫嗎?支持居中、平鋪、x 平鋪、y 平鋪、九宮格、三宮格、縮放和按比例縮放等各種繪制效果嗎?支持顯示文本嗎?支持點擊嗎?支持勾選嗎?
12. 控件:edit
支持 edit 不難,要做好卻不容易:支持拷貝、剪切和粘貼嗎?支持撤銷和重做嗎?支持通過鍵盤和鼠標選擇嗎?支持輸入法嗎?可以根據(jù)各種輸入類型自動選擇軟鍵盤嗎?可以自定義軟鍵盤嗎?可以指定獲得焦點時軟件盤是否自動開啟嗎?可以指定獲失去焦點時軟件盤是否自動關(guān)閉嗎?支持設置有效性檢查函數(shù)嗎?支持失去焦點時自動修復輸入值嗎?支持失去焦點時提示輸入有誤嗎?支持輸入提示嗎?支持輸入有變化時提示嗎?支持時間、日期和 IP 地址等格式輸入嗎?
13. 控件:button
是否支持長按?是否支持設置長按時間?是否支持重復觸發(fā)?是否支持圖標?是否支持子控件(如圖片和動畫)?
14. 控件:軟鍵盤
軟鍵盤使用 XML/JSON 描述嗎?可以定制軟鍵盤(鍵盤布局和風格)嗎?定制軟鍵盤需要修改代碼嗎?軟鍵盤可以用純方向鍵切換焦點嗎?
15. 控件:table view
支持放入進度條、選擇框、按鈕、圖片和編輯器嗎?支持 View 和 Model 分離嗎?能支持千萬級別的數(shù)據(jù)嗎?
16. 控件:code editor
有些高手常用兩個指標來衡量 GUI 的功能:1. 能用它開發(fā)一個記事本嗎?2. 能用它開發(fā)一個界面設計器嗎?如果支持 code editor,就可以用它實現(xiàn)一個功能更強大的記事本。
17. 控件:html view
HTML View 可以用來實現(xiàn)在線幫助、報表預覽功能或者一些特殊的界面效果。
18. style
是否支持設置圓角半徑?是否支持對部分角設置圓角?是否可以分別設置上下左右的邊框?是否支持自定義的狀態(tài)?
19. 對話框高亮
彈出對話框時:是否支持對話框背景變暗?是否支持對話框背景動態(tài)變暗?是否支持對話框背景動態(tài)變模糊?是否支持新的對話框高亮策略。
20. 鍵盤切換焦點
是否支持鍵盤切換焦點?是否支持上下左右切換焦點(有的設備只有方向鍵和確認鍵)?是否支持設置切換焦點的鍵值?
21. 截屏
是否支持截屏?
22. 操作反饋
是否支持按鍵音?不同的控件支付支持不同的按鍵音?是否支持觸屏震動?
23. Accessibility
是否支持字體整體放大?是否支持讀屏軟件?
24. 存儲接口
有沒有提供跨平臺的存儲接口,如文件系統(tǒng)、配置信息和數(shù)據(jù)庫。
25. 資源管理
有沒有統(tǒng)一的資源管理接口?資源管理也是很麻煩的事情:比如圖片,它可能存放在 flash 中,可能存放在文件系統(tǒng)中,也可能放在服務器上;對于普通屏和高清屏需要加載不同的文件;不同的語言也可能需要加載不同的文件;同一個軟件在不同的系統(tǒng)上運行,可能要加載不同的格式,有的系統(tǒng)只能使用位圖,有的系統(tǒng)可以使用 png/jpg;圖片還需緩存,緩存還需要清理。所有這些東西,如果讓應用程序來處理,那將是一場噩夢!
強大的資源管理器,可以屏蔽所有這些細節(jié),讓應用程序無需感知。比如,你需要"earth"這個圖片,你無需關(guān)心它的位置和格式,無需關(guān)心屏幕密度和語言的影響,系統(tǒng)自動加載最佳的圖片文件。
26. 事件處理流程
事件有沒有區(qū)分 Bubbling 和 capturing 階段?事件在不同階段是否可以中止執(zhí)行?是否有 pointer down abort 或 pointer down cancel 之類的事件?
27. framebuffer
是否支持單 framebuffer?是否支持雙 framebuffer?是否支持 3 framebuffer?是否支持 fragment framebuffer? 是否支持單色屏?是否能支持各種特殊的格式的 framebuffer? 是否支持 SPI 等特殊硬件的屏?
28. 光標
在非觸摸屏的系統(tǒng)中,光標仍然是必不可少的功能。是否支持設置光標?是否支持根據(jù)當前的控件自動切換光標?是否支持根據(jù)當前的狀態(tài)切換光標?
29. 窗口置頂
是否支持將指定窗口置頂?
30. 窗口管理
是否支持打開窗口時關(guān)閉當前窗口?是否支持將打開的窗口提到前臺?是否可以關(guān)閉指定的窗口?是否支持回到 Home 窗口?是否可以設置窗口的關(guān)閉特性(唯一實例、禁止關(guān)閉、直接關(guān)閉和需要確認后關(guān)閉)? 對話框是否支持模態(tài)和非模態(tài)?
31. 基礎庫是否強大
是否提供了強大而且跨平臺的基礎庫?特別是 C 語言開發(fā),字符串、動態(tài)數(shù)組、鏈表、對象、事件發(fā)射器、定時器、字符串編碼轉(zhuǎn)換、文件、線程、互斥鎖、信號量、時間、日期、動態(tài)庫加載、共享內(nèi)存和各種流的抽象都是非常有用的,如果提供一套穩(wěn)定可靠的基礎庫,可以大大降低應用程序的開發(fā)成本。
32. 是否支持屏幕旋轉(zhuǎn)
在沒有 GPU 的情況下,屏幕旋轉(zhuǎn)會大幅降低性能,應該盡量避免屏幕旋轉(zhuǎn)。但是在項目早期,在買來的開發(fā)板上開發(fā),確實可能有旋轉(zhuǎn)的需求,如果 GUI 支持旋轉(zhuǎn),也是很方便的。
在 Android/iOS 上,有些應用橫屏使用更加方便,對于一個跨平臺的 GUI,支持動態(tài)旋轉(zhuǎn)無疑也是加分項。
33. 是否支持流行的動畫格式
如果支持 rive 和 lottie 等流行的動畫格式,在應用程序中直接播放這些動畫,那么美術(shù)輸出的動畫可以無縫的對接到應用程序中來??梢宰寫贸绦蜃龅酶岣?,同時不會增加開發(fā)的工作量。
性能
1. 高效的算法
是否支持臟矩形算法、3 framebuffer 和 二進制格式。開發(fā)時使用 XML 方便程序員修改,運行時使用高效二進制格式提高運行效率。
2. 2D 硬件加速
是否支持常見的加速接口,如 STM32 的 DMA2D 和 NXP 的 PXP。廠家是否可以擴展自己的加速接口。
3. 3D 硬件加速
是否支持 OpenGL、DirectX、Vulkan 和 Metal 等。
4. 低端平臺
最低能支持什么樣的硬件平臺?功能強大體積通常比較大,這對 GUI 的可配置性是一個極大的考驗。
5. 啟動時間
1 秒啟動?5 秒啟動?還要等半分鐘?
國際化
1. Unicode
是否支持 UTF-8 和 UTF-16 編碼?
2. 多國語言輸入法
是否支持 T9 輸入法?是否可以支持新的輸入法?
3. 字符串翻譯
是否支持字符串翻譯?是否支持實時切換語言(不需重啟)?
4. 圖片翻譯
是否支持圖片翻譯(既切換語言時,自動切換某些圖片)?
5. 文字雙向排版
是否支持阿拉伯文字的雙向排版?
6. 編碼轉(zhuǎn)換函數(shù)
是否提供的跨平臺的編碼轉(zhuǎn)換函數(shù)?
軟件質(zhì)量
1. 單元測試
是否有完整的單元測試?單元測試是否全部通過?
2. 內(nèi)存耗盡處理流程
內(nèi)存耗盡時是直接崩潰?還是讓應用程序能優(yōu)雅的退出?
3. 內(nèi)存泄露檢查機制
是否有內(nèi)存泄露檢查機制?是否能用 valgrind 進行內(nèi)存泄露和溢出檢查?
4. 代碼靜態(tài)檢查
是否通過了 cppcheck、infer 或其它靜態(tài)檢查工具的檢查?
5. 事件錄制和重放功能
是否可以錄制用戶操作的事件,并通過重放進行壓力測試?
6. Appuim 進行自動測試
是否支持 Appuim,通過 javascript 等腳本自動化集成測試?GUI 引擎本身是否有回歸測試用例?
【版權(quán)聲明】文章為ZLG開發(fā)者社區(qū)用戶原創(chuàng)內(nèi)容,未經(jīng)授權(quán)不得轉(zhuǎn)載,點擊“閱讀原文”查看原文。歡迎更多用戶到社區(qū)交流互動、創(chuàng)作博文,一經(jīng)采用,可獲得百元京東E卡。
地址:https://developer.zlg.cn(長按復制到PC端打開)