作者: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. [RxJS] Implement pause and resume feature correctly through RxJS

    Eventually you will feel the need for pausing the observation of an Observable and resuming it later ...

  2. [Vue] Build Vue.js Apps with the Vue-CLI and Nuxt.js

    The vue-cli allows you to easily start up Vue projects from the command line while Nuxt.js enables a ...

  3. Cygwin 与 MinGW/MSYS/MSYS2,如何选择?甚至还有GNU utilities for Win32

    Cygwin与MinGW/MSYS,如何选择? 2012-11-03更新:加入 MSYS 的内容. 2013-10-15更新:修改表格格式,加入介绍链接. 2014-12-17更新:加入 MSYS2 ...

  4. 定义变量let,const

    1.块级作用域let 声明变量,作用域是最近的"{}": 'use strict'; { let test = '1'; } console.log(test);//test is ...

  5. Android与IOS的UUID的区别

    UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OS ...

  6. 【u225】最优分解方案

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 经过第一轮的游戏,不少同学将会获得圣诞特别礼物,但这时细心的数学课代表发现了一个问题: 留下来的人太多 ...

  7. tomcat 去除端口和项目名/使用域名访问/修改超链接为IP地址

    1.打开tomcat/conf/server.xml 在host标签中加入 <Context  docBase="项目名" path="" reloada ...

  8. 【ORACLE】spfile失落的处理

    ************************************************************************ ****原文:blog.csdn.net/clark_ ...

  9. SpringBoot 打包成war包,部署到tomcat

    使用maven创建的springboot项目,默认是jar包,springboot还有自己带的tomcat.现在需要将项目打包,并部署到服务器tomcat下面. 1.修改pom.xml文件.将jar修 ...

  10. CodeBlocks提供了预编译的WxWidgets模块,并预置TDM

    Miscellaneous For Windows, we also provide the pre-compiled wxWidgets, version 2.8.12 used to compil ...