- 主题:想学习编程,求推荐
C++ Builder 的几百 KB EXE 也要画界面。只不过画界面的代码在 Windows 自带的 user32l.dll 里面,而 Qt 则是自带而已。
你这 GUI 编程没入门啊。Qt 发展了几十年,怎么可能比 C++ Builder 那一套古董的 user32.dll 还慢。所有现代的 GUI 构架都走向和 Qt 一模一样的 DirectUI 绘制方案,包括 Android, iOS 和 WPF,不是没有道理的。
【 在 ooolinux 的大作中提到: 】
: 就是初始化也得多花时间,而且Qt程序每次界面变化不得调用底层库,这些庞大库代码的运行要多花时间。
--
FROM 183.253.147.*
Qt 两种方案,一种是 QtQuick 使用的 QRHI, 底层是 directx/opengl/metal 每个平台各写一套的 shader. 另一种是 QtWidgets 使用的申请一段内存由 CPU 搞控件绘制,然后调用 gdi32.dll 的 BltBit 一次性复制到 GPU 显存。我研究过,BltBit() 在 Vista 以后的变化就是增加了 GPU 加速能力,是少数 GDI 里面有改进的函数。
前者直接到 GPU 做复杂效果,后者低延迟不卡顿。无论哪种方案都比 C++ Builder 强。
【 在 philbloo 的大作中提到: 】
: 现在 gui 的 api 离 diretx/opengl/metal 有多远?qt 自己做 triangulation 吗?还是 rasterization ?
--
修改:hgoldfish FROM 183.253.147.*
FROM 183.253.147.*
你没明白 user32.dll 的内部原理啊。它的绘制是一层叠一层,效率很差的。你搜一下 DirectUI 的历史就知道,我这里不详细说了。gdi32.dll 和 user32.dll 是纯 C 代码写的,前者对应于 Google 的 skia, gtk 的 cario,Qt 的 QtGui,是 2D 图形库,后者是控件库。这俩用的都是远古的技术,因为兼容性,已经很久没有改动了。
内核是内核,图形层是图形层。Windows 下所有的窗口软件都必须调用 user32.dll 创建窗口并绘制在窗口里面。谁都不例外。user32 自己也不例外。
讨论这些远古的技术挺无聊的。让我们来讨论 rust 怎么样写裸机应用一统天下吧。
【 在 ooolinux 的大作中提到: 】
: 实际上user32.dll的GDI显示很快(Windows内核都是汇编造的,就算几十年前80386电脑的win3.1都很快),而Qt程序在慢一点的电脑界面显示会先显示窗口框架,然后窗口内容才显示出来。
--
修改:hgoldfish FROM 183.253.147.*
FROM 183.253.147.*
有时间我还不如去学 rust 和 nim 搞裸机开发或者 AI 搞钱。
它再强,难道还能比其它家的技术还强?你前面还在说 gdi32/user32 比 QtGui/QtWidgets 强,表明你对 GUI 的底层技术不太理解。后面再说哪个强我不敢信啊。
时代已经过去了。这些市场竞争的失败者还是洗洗睡吧。非要搞 GUI 开发的话,卷 20 年前的传统技术领域,还不如准备迎接未来的 VR 开发。实在不行也是搞移动端开发啊。
【 在 ooolinux 的大作中提到: 】
: 了解一下Delphi/C++ Builder跨平台的FMX框架(FireMonkey)
: GPU 加速能力,是少数 GDI 里面有改进的函数。
--
FROM 183.253.147.*
你别应该了,也别必然更快。
如果说更快,也是 QtGui 和 Google skia 更快,它们都使用了 AVX256 在加速绘制。这地方不用汇编,因为现代编译器都有 SIMD 专用函数。
Windows 源码有泄露的,你直接去证实一下吧。
【 在 ooolinux 的大作中提到: 】
: 就算C代码应该也是嵌入汇编的,关键的地方必然快。
: 远古的技术,因为兼容性,已经很久没有改动了。
--
FROM 183.253.147.*
然而并没有。我叫你去搜一下 DirectUI 的来龙去脉,你咋一直在重复呢。
【 在 ooolinux 的大作中提到: 】
: 我没说gdi32/user32更强,只是说它绘制快。
--
FROM 117.24.95.*
对,micro benchmark 下 shader 快,特别是动画效果、透明、等图形效率特别多的情况。但窗口 GUI 编程这种场景比较特殊。比如字体引擎根据规则渲染出一段大小不一的 LCD 子像素反锯齿文字,多数情况下使用 CPU 在内存中渲染后再输出给 GPU 显存反而更快。
不过巨硬已经开发出 DirectWrite 据说能够加速这种场景。有了解的可以过来普及一下,内部是啥原理。为啥苹果 iOS,Google Android 都做不到的事情,巨硬做到了。
【 在 philbloo 的大作中提到: 】
: 哦 那跟其它的图形库一样
: 顺便说一句,应该是直接写 framebuffer 比用 shader 慢得多。
: GPU 加速能力,是少数 GDI 里面有改进的函数。
: ...................
--
FROM 183.253.147.*
一个是因为以前的文字渲染用了各种加速手段。比如 windows 以前对英文中文使用的其实是内嵌点阵,一直到 winxp 之后搞了才有 LCD 子像素渲染。二是以前的分辨率比较低,现在到处都是高 DPI 屏幕渲染计算量翻倍。三是文字渲染一般都是 TrueType,很难跑在 GPU 上面。四是浏览器渲染复杂度比静态文字高,Unicode还有各种奇葩。
我记得 3D 文字渲染一般也是在 CPU 里面渲染好之后,丢到显存里面当贴图。
文字的渲染绝对算这个世界上最复杂的工程之一。人类搞了几十年还没到尽头。
【 在 chaobill 的大作中提到: 】
: 话说文字渲染就没见过成为2D引擎慢的原因的
: 3D 文字渲染以前总是出问题
--
FROM 183.253.147.*
所以巨硬的 DirectWrite 已经用上了这种技术了是吗?
【 在 dilemma 的大作中提到: 】
: 大约20年前的gpu gems系列里有篇文章,作者脑洞大开提出了个极简单算法,优点包括:
: 非常适合渲染矢量字体,只用了二次贝塞尔曲线的truetype字体是最简单的情况
: 三角化一次就能渲染任意尺寸,三角化的计算可以离线预处理
: ...................
--
FROM 183.253.147.*