作者:Bingo
链接: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++完成与游戏引擎逻辑的结合,本质上而言会增加初始化脚本解析的耗费但这在具体应用中是可以接受的。

因此先前造了几次轮子,自己写的TattyUI(https://github.com/BentleyBlanks/TattyUI)使用HTML+CSS+C++完成界面开发(雏形),欢迎Star+怒喷(目前只支持Windows+OSX,未测试Linux)。
<img src="https://pic1.zhimg.com/50/7a31f4b65b0a8b65b095f7da2f26c5f4_hd.png" data-rawwidth="1303" data-rawheight="826" class="origin_image zh-lightbox-thumb" width="1303" data-original="https://pic1.zhimg.com/7a31f4b65b0a8b65b095f7da2f26c5f4_r.png">

 
https://www.zhihu.com/question/24462113

用C++写UI库最本质的思想就是不用C++写UI(如何用 C++ 从零编写 GUI?内含多个开源UI作者的回复,非常精彩)的更多相关文章

  1. 移动Web UI库(H5框架)

    1.Framework7 Framework7 - is a free and open source mobile HTML framework to develop hybrid mobile a ...

  2. 移动Web UI库(H5框架)有哪些,看这里就够了

    前言 今年上半年,项目组在项目开发的过程中建立了一套风格统一,组件丰富完善,命名统一规范的PC端UI库,适用于做大型站点,该UI库也是应用到了整个平台的项目中,在各个项目组中进行推广.因为项目的保密性 ...

  3. 【摸鱼神器】UI库秒变LowCode工具——列表篇(一)设计与实现

    内容摘要: 需求分析 定义 interface 定义 json 文件 定义列表控件的 props 基于 el-table 封装,实现依赖 json 渲染 实现内置功能:选择行(单选.多选),格式化.锁 ...

  4. Webix JavaScript UI 库可以帮你构建跨平台的HTML5 和 CSS3 程序

    XB 软件公司最近发布了JavaScript UI 库Webix ,其中包含的组件超过45个,用这些组件可以构建跟HTML5 和 CSS3 兼容的程序,这些程序不仅能在个人电脑上运行,还能用在iOS. ...

  5. 微信小程序开发04-打造自己的UI库

    前言 github地址:https://github.com/yexiaochai/wxdemo 接上文继续,我们前面学习了小程序的生命周期.小程序的标签.小程序的样式,后面我们写了一个简单的load ...

  6. avalon新一代UI库发布

    任何前端框架,尤其是国内的,想推广开,必须有一个UI库,光是一个核心库当光头司令是不行的.此外还有一个小圈子,供大家遇到问题时可以发问,一起完善.自从avalon嫁入"去哪儿网"后 ...

  7. Linux系统中UI库curse.h不存在问题——贪吃蛇为例

    1. 问题 大家在用Linux写程序时,大家会使用Linux gcc编译器中的头文件curse.h.但往往一般的发行版中都没有默认安装这个头文件,需要大家自行安装.最近遇到这个问题,如下: Red  ...

  8. 自已实现一个UI库

    [2014年写一个UI库时写的几个文章,公布出来] 几年前的一个嵌入式的UI开发,使自己有机会接触到了UI的一些底层知识,尽管之前也开发过非常多Windows下的信息应用系统,也做非常多的界面开发,但 ...

  9. vue-cli3.0结合lib-flexible、px2rem实现移动端适配,完美解决第三方ui库样式变小问题

    公司最近做的一个移动端项目从搭框架到前端开发由我独立完成,以前做移动端适配用的媒体查询,这次想用点别的适配方案,然后就采用了vue-cli3.0结合lib-flexible.px2rem实现移动端适配 ...

随机推荐

  1. P2P网贷第三方托管模式存在5大缺陷,托管机构才是最大赢家

    1.注册开户需要2次,用户体验很差劲儿.   理财人和借款人,首先在平台注册,然后还要在第三方托管账户注册.   很多类似的地方,用户体验非常差劲.   比如,密码4个.   平台:登录密码.交易密码 ...

  2. C++项目參考解答:累加求圆周率

    [项目-累加求圆周率] 用例如以下公式求π的近似值(计算直到最后一项的绝对值小于10−5) π4=1−13+15−17+... [參考解答] #include <iostream> usi ...

  3. python 升级pip

    废话少说,直接上图,希望谅解我的懒惰!:)

  4. Mysql 安装(Using Generic Binaries)

    本次 Mysql 为Community 5.6.21 版本号.安装方式为通用Linux安装方式.即大多数Linux平台都能够採用该方式进行安装. 一.安装步骤 1.安装环境 1)Centos 7.0. ...

  5. php面试题11(边看边复习刚刚讲的)(array_multisort($arr1,$arr2); 用$arr1来排序$arr2。)

    php面试题11(边看边复习刚刚讲的)(array_multisort($arr1,$arr2); 用$arr1来排序$arr2.) 一.总结 1.边看边复习刚刚讲的 2.array_multisor ...

  6. pycharm Zooming in the Editor

    https://www.jetbrains.com/help/pycharm/zooming-in-the-editor.html To enable changing font size in th ...

  7. Cocos2d-x 3.2 Lua演示样例FontTest(字体測试)

    Cocos2d-x 3.2 Lua演示样例FontTest(字体測试) 本篇博客介绍Cocos2d-x 3.2中Lua測试项目中的FontTest样例,主要使用了字体文件来创建我们想要的字体样式: 第 ...

  8. net的微服务架构

    net的微服务架构 眼下,做互联网应用,最火的架构是微服务,最热的研发管理就是DevOps, 没有之一.微服务.DevOps已经被大量应用,它们已经像传说中的那样,可以无所不能.特来电云平台,通过近两 ...

  9. 微信小程序开发实战视频教程

    微信小程序开发实战视频教程发布  有全套的 pan.baidu.com/s/1o8GuJOY 密码:2dbo 腾讯终于发布了没有APPid,无需申请也可以进行微信小程序开发的视频教程了,我在在第一时间 ...

  10. Using Eredis, Redis With Erlang

    http://no-fucking-idea.com/blog/2012/03/23/using-eredis-in-erlang/ Using Eredis, Redis With Erlang M ...