鏈接:https://www.zhihu.com/question/24462113/answer/83371803
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
用C++寫UI庫最本質的思想就是不用C++「寫」UI。
不管是開放C++底層庫到XML+Json+Lua的實現,或是單一使用XML完成布局管理,或是現前流行的使用Electron(http://electron.atom.io/)也就是HTML+CSS+JS完成UI實現的,本質上都不希望使用C++來完成繁復的工作。
所以C++主要是用來完成支持上層腳本運行的底層框架搭建的,也會根據是否是跨平台而有很大的區別,是否要在C++中完成回調也不同(避免回調最好的辦法莫過於ImGui),嚴格來講大致分為這樣一些。
1. 基本的渲染底層:OpenGL/DirectX支持? 平台支持? GPU支持? 外部庫,推薦skia(Docs)或者nanovg(memononen/nanovg: Antialiased 2D vector drawing library on top of OpenGL for UI and visualizations.)),
2. 腳本解析框架:XML/HTML?推薦Gumbo(google/gumbo-parser · GitHub),也支持XML解析,相較TinyXML用戶體驗會好不少; Json/CSS? Lua/JS? 都是自己考慮設計造輪子要考慮到的點。
3. 內存管理: 是否要在UI庫中自行划定內存池、小內存分配器的概念?推薦可以看「提高C++性能的編程技術」(http://www.amazon.cn/%E6%8F%90%E9%AB%98C-%E6%80%A7%E8%83%BD%E7%9A%84%E7%BC%96%E7%A8%8B%E6%8A%80%E6%9C%AF-%E5%B8%83%E5%B0%94%E5%8D%A1/dp/B004S76ZV4)里面對於內存分配講解的由淺入深,拉屎美文必備。
4. 事件管理: 是否使用事件這樣一個不太「穩定」的點來完成信息傳遞這一步是有爭議的,但對於個人的造輪子項目會是一個非常直觀的選擇。選用全局的事件隊列+局部事件隊列都是不錯的選擇。基本上談到事件都會引申到callback。不管你的回調是在腳本中實現的,或是在C++中完成,都需要對回調進行一系列的管理操作
6. 布局管理: 這一部分事實上會是一個比較錦上添花的作用,一般已經是完成了大部分基礎平台的搭建,那么可以考慮各類Layout實現,推薦查閱Android的五大不同Layout(http://developer.android.com/guide/topics/ui/declaring-layout.html,借鑒意義比較大)
7. 動畫管理: 同樣的也是一個比較后期的模塊,作為客戶端動畫的佼佼者,iOS上的Core Animation會是一個很不錯的借鑒對象(About Core Animation),可以觀察網上各類博文的使用來仿造其具體動畫實現。Tweener的實現網上蠻多的,隨便拉一個就是了(Google的就不錯https://code.google.com/archive/p/cpptweener/)。
8. 單元測試: 其實這一部分應該是最先就建構的部分,單凡上規模上W的代碼量光靠一句「應該對吧」已經無法印證代碼的正確性,所以每個模塊做好「充分」的單元測試非常的有必要,尤其是自行實現的數學庫等。推薦gTest(http://code.google.com/p/googletest/)
======================================================================
一點小事:說前端是世界上開發界面最好的一項搭配之一我想這不會有任何異議,但在游戲這樣高FPS要求下HTML+CSS+JS的組合未免有些吃力。因此兩者較好的結合我認為會是HTML+CSS完成邏輯與樣式布局分離的思想,C++完成與游戲引擎邏輯的結合,本質上而言會增加初始化腳本解析的耗費但這在具體應用中是可以接受的。
