用C++写UI库最本质的思想就是不用C++写UI(如何用 C++ 从零编写 GUI?内含多个开源UI作者的回复,非常精彩)
链接: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">
用C++写UI库最本质的思想就是不用C++写UI(如何用 C++ 从零编写 GUI?内含多个开源UI作者的回复,非常精彩)的更多相关文章
- 移动Web UI库(H5框架)
1.Framework7 Framework7 - is a free and open source mobile HTML framework to develop hybrid mobile a ...
- 移动Web UI库(H5框架)有哪些,看这里就够了
前言 今年上半年,项目组在项目开发的过程中建立了一套风格统一,组件丰富完善,命名统一规范的PC端UI库,适用于做大型站点,该UI库也是应用到了整个平台的项目中,在各个项目组中进行推广.因为项目的保密性 ...
- 【摸鱼神器】UI库秒变LowCode工具——列表篇(一)设计与实现
内容摘要: 需求分析 定义 interface 定义 json 文件 定义列表控件的 props 基于 el-table 封装,实现依赖 json 渲染 实现内置功能:选择行(单选.多选),格式化.锁 ...
- Webix JavaScript UI 库可以帮你构建跨平台的HTML5 和 CSS3 程序
XB 软件公司最近发布了JavaScript UI 库Webix ,其中包含的组件超过45个,用这些组件可以构建跟HTML5 和 CSS3 兼容的程序,这些程序不仅能在个人电脑上运行,还能用在iOS. ...
- 微信小程序开发04-打造自己的UI库
前言 github地址:https://github.com/yexiaochai/wxdemo 接上文继续,我们前面学习了小程序的生命周期.小程序的标签.小程序的样式,后面我们写了一个简单的load ...
- avalon新一代UI库发布
任何前端框架,尤其是国内的,想推广开,必须有一个UI库,光是一个核心库当光头司令是不行的.此外还有一个小圈子,供大家遇到问题时可以发问,一起完善.自从avalon嫁入"去哪儿网"后 ...
- Linux系统中UI库curse.h不存在问题——贪吃蛇为例
1. 问题 大家在用Linux写程序时,大家会使用Linux gcc编译器中的头文件curse.h.但往往一般的发行版中都没有默认安装这个头文件,需要大家自行安装.最近遇到这个问题,如下: Red ...
- 自已实现一个UI库
[2014年写一个UI库时写的几个文章,公布出来] 几年前的一个嵌入式的UI开发,使自己有机会接触到了UI的一些底层知识,尽管之前也开发过非常多Windows下的信息应用系统,也做非常多的界面开发,但 ...
- vue-cli3.0结合lib-flexible、px2rem实现移动端适配,完美解决第三方ui库样式变小问题
公司最近做的一个移动端项目从搭框架到前端开发由我独立完成,以前做移动端适配用的媒体查询,这次想用点别的适配方案,然后就采用了vue-cli3.0结合lib-flexible.px2rem实现移动端适配 ...
随机推荐
- 【转】HTML5移动端最新兼容问题解决方案
1.安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率来显 ...
- 一起talk C栗子吧(第八十三回:C语言实例--进程间通信概述)
各位看官们,大家好,前二回中咱们说的是进程停止的样例,这一回咱们说的样例是:进程间通信.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们.每一个进程都拥有自己的资源,假设不同进程之间须要共享 ...
- Bash玩转脚本1之自己的脚本安装程序
Bash之打造自己的脚本安装器 前言 还是理所当然的前言,我一直想找一套管理脚本的"框架",能让自己杂乱的脚本有点规整.无奈眼界尚浅,未能找到. 因此萌生自己写一点优化脚本的工具来 ...
- ios开发Base64编码以及加密相关学习
一:.Base64补充 ```objc 1.Base64简单说明 描述:Base64可以成为密码学的基石,非常重要. 特点:可以将任意的二进制数据进行Base64编码 结果:所有的数据都能被编码为并只 ...
- GitHub项目协作基本步骤 分类: C_OHTERS 2013-09-23 21:31 690人阅读 评论(0) 收藏
1.查找某个项目,然后Fork 2.打开GitHub For Windows,发现刚才Fork的项目 3.对着项目点击Clone,将之复制至本地 4.使用Eclipse等进行开发,如新增一个文件 5. ...
- wdcp忘记mysql的root密码
复制别人的 不管出于何种原因,应该有不少的朋友在自己的VPS/服务器上采用WDCP管理面板的时候有忘记MYSQL ROOT账户管理密码在寻找解决方法,甚至有忘记WDCP后台管理登录密码的.这些问题都比 ...
- jquery zoom jquery放大镜特效
这是一款非常不错的给图片添加放大镜效果,可以应用在诸如zen cart,magento电子商场之类的开源项目上.如果想看它的效果,你可以直接访问: http://www.mind-projects.i ...
- C# WebQQ协议群发机器人(一)
原创性申明 本文地址 http://blog.csdn.net/zhujunxxxxx/article/details/38931287 转载的话请注明出处. 之前我也写过一篇使用python来实现的 ...
- C++ 计算任意两个日期之间的天数
C++写的一个计算两个日期之间天数的小程序: #include <Windows.h> #include <stdio.h> struct tagDate { int year ...
- Qt 连接MySQL数据库(很多相关文章)
今天想试试Qt如何连接数据库的. 谁知怎么写完了提示driver not loaded我就郁闷了. 我自己是 VS2010 + Qt4.8.4 + MySQL5.1 的环境 网上查到是 C:\Qt\4 ...