【史上最全讲解】如何选择GUI框架?
基本上所有GUI框架都可以归类到如下三个路线中。
(1)基于系统原生控件
这种之前比较常见,例如PC上著名的跨平台C++库wxWidgets、GTK等,Mobile上比较典型的就是React Native了。
- 优点:体积小、内存占用小,系统原生性能。
- 缺点:可拓展性差,跨平台表现不一致。
这类的主要特性是使用操作系统提供的原生控件,编译的最终程序体积较小。
内存占用一般也比较小,因为一般使用这个方案的需求中不会有太多动态字体变更、或者大量的图片资源。
因为是操作系统自己实现的控件,系统原生级别的,性能也没什么大问题。
(2)基于CPU/GPU自绘
这种就是对实时性要求比较高的场景需要的,典型的就是游戏中的界面UI了。因为游戏的界面需要每帧刷新,所以一般游戏内都会自己在渲染引擎上封装一套基于OpenGL/Direct3D/Metal的UI框架。还有一种典型应用场景就是类似Photoshop这种图形处理软件,对UI的美观要求比较高的设计软件,需要自己精确控制各种按钮文本样式的。
- 基于CPU的就是所谓的软渲染,例如在SDL中,就可以却换使用CPU渲染还是GPU渲染。
- 基于GPU的就是刚才说的游戏UI这种。
特点也显而易见
- 优点:自绘,极高的拓展性,可以实现任何自己想要的效果。
- 缺点:需要较好的CPU/GPU硬件,打包体积和运行时内存比较大。
(3)基于Web
基于Web的典型就非Electron莫属了,基于浏览器封装的网页渲染技术,将传统的GUI转成网页中的HTML节点来渲染,让浏览器完成跨平台渲染。本质上还是自绘,只不过自绘是浏览器内部完成的,例如Chrome/Firefox在Windows上的WebGL渲染后端ANGLE。
得益于浏览器的各种成熟技术,基于浏览器开发GUI程序的效率极高,且技术门槛也非常低。
当然,基于Web的路线之所以会火起来,在我看来,最功不可没的是React/Vue等前端框架所带来的前端技术栈的快速发展,以及相应的成熟组件库迅猛发展。
在基于系统原生控件的范畴内,开发人员比本上必须会C/C++等系统编程语言,以及各种操作系统底层API编程技能。在基于CPU/GPU自绘的范畴内,开发人员虽然不需要接触太多操作系统底层的编程知识,但是基本上也是需要C/C++等Native编程语言的,同时或多或少也会涉及计算机图形学相关的内容。这些底层技术在当下的社会发展中,应对高速的项目需求变动就显得很不灵活,所以目前很多项目都是走基于Web这条路线的。
- 优点:
- 开发效率高,界面非常好看
- 近乎完美的跨平台一致性
- 非高实时性和嵌入式应用几乎是必选。
- 缺点:
- 打包体积大、运行时内存占用多。
- 与操作系统底层相关的拓展稍微不太方便
总结
- 大部分场景下,基于Web路线几乎就是首选。
- 语言基本上就是JavaScript了。
多说一点基于Web
在Web路线下,也不只Electron一个选项,Electron后端是基于Nodejs实现的。这部分可以换成Quickjs等mini的JavaScript引擎来实现体积优化。
也可以自己使用CEF参考Electron来封装一套类似框架,没必要绑定到Electron这一条技术栈上。
实战相关
因为对GUI编程非常感兴趣,所以今天我也自己做了个实战项目:剪切板助手。
技术路线就是(2)中的基于GPU绘制
,将游戏的UI渲染框架拿来作为通用GUI框架开发非实时类App。
理论上界面的可定制性以及性能都能是T1级别的。大家可以自行体验下,看看体积和性能。