作者: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. Pandoc —— 标记语言转换工具(中文乱码问题)

    今次毕业设计,来个逼格高的,用 latex 编写.谁曾想,学院首先要收一份 word 版的.辣么多的 latex 公式如何转呀. Pandoc 是由 John MacFarlane 开发的标记语言转换 ...

  2. Multi-core compute cache coherency with a release consistency memory ordering model

    A method includes storing, with a first programmable processor, shared variable data to cache lines ...

  3. Maven实战——有用Nexus创建私服(下)

    使用Maven部署构件至Nexus 日常开发生成的快照版本号构件能够直接部署到Nexus中策略为Snapshot的宿主仓库中.项目正式公布的构建部署到Nexus中策略为Release的宿主仓库中.PO ...

  4. Lucene学习总结之一:全文检索的基本原理 2014-06-25 14:11 666人阅读 评论(0) 收藏

    一.总论 根据http://lucene.apache.org/java/docs/index.html 定义: Lucene 是一个高效的,基于Java 的全文检索库. 所以在了解Lucene之前要 ...

  5. TF-IDF计算方法和基于图迭代的TextRank

    文本处理方法概述 说明:本篇以实践为主,理论部分会尽量给出参考链接 摘要: 1.分词 2.关键词提取 3.主题模型(LDA/TWE) 4.词的两种表现形式(词袋模型和分布式词向量) 5.关于文本的特征 ...

  6. 【9201】&&【a201】明明的随机数

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整 ...

  7. ORACLE会话数、连接数配置

    ORACLE会话数.连接数配置 ORACLE会话数.连接数配置 ORACLE的会话数和连接数参数配置 以sysdba身份登录 sqlplus sys/xxxx as sysdba; 查看最大连接数: ...

  8. [Compose] 12. Two rules about Funtors

    We learn the formal definition of a functor and look at the laws they obey. Any Functor should follo ...

  9. todo bitnami

    https://bitnami.com/stack/dokuwiki https://bitnami.com/stack/jenkins/installer

  10. 【u018】电车

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道 ...