用C++寫UI庫最本質的思想就是不用C++寫UI(如何用 C++ 從零編寫 GUI?內含多個開源UI做者的回覆,很是精彩)

做者:Bingo
連接:https://www.zhihu.com/question/24462113/answer/83371803
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

用C++寫UI庫最本質的思想就是不用C++「寫」UI。html

無論是開放C++底層庫到XML+Json+Lua的實現,或是單一使用XML完成佈局管理,或是現前流行的使用Electron()也就是HTML+CSS+JS完成UI實現的,本質上都不但願使用C++來完成繁複的工做。前端

因此C++主要是用來完成支持上層腳本運行的底層框架搭建的,也會根據是不是跨平臺而有很大的區別,是否要在C++中完成回調也不一樣(避免回調最好的辦法莫過於ImGui),嚴格來說大體分爲這樣一些。android

1. 基本的渲染底層:OpenGL/DirectX支持? 平臺支持? GPU支持? 外部庫,推薦skia(Docs)或者nanovg(memononen/nanovg: Antialiased 2D vector drawing library on top of OpenGL for UI and visualizations.)), git

2. 腳本解析框架:XML/HTML?推薦Gumbo(google/gumbo-parser · GitHub),也支持XML解析,相較TinyXML用戶體驗會好很多; Json/CSS? Lua/JS? 都是本身考慮設計造輪子要考慮到的點。github

3. 內存管理: 是否要在UI庫中自行劃定內存池、小內存分配器的概念?推薦能夠看「提升C++性能的編程技術」()裏面對於內存分配講解的由淺入深,拉屎美文必備。編程

4. 事件管理: 是否使用事件這樣一個不太「穩定」的點來完成信息傳遞這一步是有爭議的,但對於我的的造輪子項目會是一個很是直觀的選擇。選用全局的事件隊列+局部事件隊列都是不錯的選擇。基本上談到事件都會引伸到callback。無論你的回調是在腳本中實現的,或是在C++中完成,都須要對回調進行一系列的管理操做app

6. 佈局管理: 這一部分事實上會是一個比較錦上添花的做用,通常已是完成了大部分基礎平臺的搭建,那麼能夠考慮各種Layout實現,推薦查閱Android的五大不一樣Layout(,借鑑意義比較大)框架

7. 動畫管理: 一樣的也是一個比較後期的模塊,做爲客戶端動畫的佼佼者,iOS上的Core Animation會是一個很不錯的借鑑對象(About Core Animation),能夠觀察網上各種博文的使用來仿造其具體動畫實現。Tweener的實現網上蠻多的,隨便拉一個就是了(Google的就不錯)。electron

8. 單元測試: 其實這一部分應該是最早就建構的部分,單凡上規模上W的代碼量光靠一句「應該對吧」已經沒法印證代碼的正確性,因此每一個模塊作好「充分」的單元測試很是的有必要,尤爲是自行實現的數學庫等。推薦gTest()ide

======================================================================
一點小事:說前端是世界上開發界面最好的一項搭配之一我想這不會有任何異議,但在遊戲這樣高FPS要求下HTML+CSS+JS的組合未免有些吃力。所以二者較好的結合我認爲會是HTML+CSS完成邏輯與樣式佈局分離的思想,C++完成與遊戲引擎邏輯的結合,本質上而言會增長初始化腳本解析的耗費但這在具體應用中是能夠接受的。

所以先前造了幾回輪子,本身寫的TattyUI( )使用HTML+CSS+C++完成界面開發(雛形),歡迎Star+怒噴(目前只支持Windows+OSX,未測試Linux)。
 
https://www.zhihu.com/question/24462113
相關文章
相關標籤/搜索