我是 Windows 开发人员,我对 WinAPI 程序有一些经验。据我所知,在 Windows 上绘图有两种方法,调用 GDI(包括 GDI 的包装器,如 GDI+)进行传统绘图或调用 DX 或 OpenGL 等 API 使用 GPU 进行绘图。但是像 Qt 之类的其他东西是什么?Qt 是否最终调用 GDI 来绘制一些东西?还是它有自己的直接绘制方式?我只是想知道它的一般理论。
3 回答
Qt 小部件使用自定义软件渲染器(自定义光栅引擎)——看起来它不是 GDI。
https://doc.qt.io/qt-5/topics-graphics.html
从您那里继承的每个小部件QPaintDevice
都可以检查绘图设备的类型:https ://doc.qt.io/qt-5/qpaintengine.html#Type-enum
QtQuick 似乎正在使用ANGLE(将在 Windows 上将 ogl 调用转换为 d3d) /纯 OpenGL - https://blog.qt.io/blog/2017/01/18/opengl-implementation-qt-quick-app-using-今天/
从外观上看,从 QT 4.0 开始,他们改变了 GDI 的使用,并用其他可能提高可移植性的内部结构替换了它,如果您愿意,QT 是开源的,因此您可以查看代码以了解 QTGUI.dll 内部结构.
在实践中我不知道这一点,但http://qt-project.org/forums/viewthread/33565的答案似乎可靠。
更新:这个页面似乎更准确:http: //qt-project.org/wiki/Qt-5-on-Windows-ANGLE-and-OpenGL
Windows 上的 Qt 5 可以通过 ANGLE 库配置为使用 OpenGL 驱动程序或 DirectX 驱动程序。你想要什么取决于你的用例。Qt 项目为这两种变体提供二进制安装程序。OpenGL
OpenGL(开放图形库)是一种广泛传播的行业标准 [opengl.org],用于渲染 2D 和 3D 计算机图形。它是 Mac OS X、Linux 和大多数嵌入式平台上硬件加速图形操作的事实标准。
OpenGL ES 2.0(嵌入式系统的开放图形库)是用于嵌入式系统的 OpenGL 精简版,它缺少一些功能。
Qt 5 中的 Qt Quick 2 堆栈基于 OpenGL,并且需要 OpenGL 3.0(或者带有 framebuffer_object 扩展的 OpenGL 2.x)或更高版本或 OpenGL ES 2.0。Qt OpenGL 模块 [qt-project.org] 需要 OpenGL 1.3 或更高版本。Windows 上的 OpenGL
尽管 Microsoft Windows 很久以来就对 OpenGL 提供原生支持,但支持的标准版本(没有安装任何驱动程序的版本 1)对于 Qt 来说太有限了。较新的版本通常可通过自定义图形驱动程序获得,但需要用户安装它们。此外,某些驱动程序对 OpenGL 的支持质量欠佳。角度项目
ANGLE(几乎是原生图形层引擎)是 Google 的一个开源项目 [code.google.com]。其目的是将 OpenGL ES 2.0 API 调用映射到 DirectX 9 API。它的定期更新版本是 qtbase [qt.gitorious.org] 的一部分。
要使用 ANGLE 编译 Qt,您必须安装 Direct X SDK [msdn.microsoft.com]。从 Windows Kit 8 开始,它包含在 Windows SDK 中。
如果在您的应用程序中使用 ANGLE,您应该将 d3dcompiler_XX.dll 与 Qt 库一起提供。D3D 着色器编译器的版本字符串是从 DirectX SDK 标头中提取的,因此请确保获得与构建 ANGLE 的版本相同的版本(例如 _43 或 _46)。如果您使用 -angle-d3d11 配置 Qt,这一点变得尤为重要。建议 如果您的应用程序使用 OpenGL 调用而不是 OpenGL ES 2.0 的一部分,则使用桌面 OpenGL 您的应用程序根本不使用 OpenGL(因为 ANGLE 意味着额外的部署依赖项,然后就不需要了)。您的应用程序需要在 Windows XP 上运行。尽管在此平台上使用 ANGLE 作为缺少的图形驱动程序的替代品很诱人,但它并不能完全正常工作,并且可能导致崩溃,例如,在打开安全对话框时。
如果您需要 OpenGL ES 功能,但不是完整的 OpenGL,请使用 ANGLE 您拥有具有不同 Windows 版本和显卡的异构用户群 您不希望您的用户必须安装最新的显卡驱动程序 您希望使用 OpenGL 的视频播放功能QtMultimedia(参见 QTBUG-31800 [bugreports.qt-project.org])您的应用程序需要在 Windows 远程桌面协议上运行(参见 OpenGL 和远程桌面 [social.technet.microsoft.com])
延伸阅读
http://qt-project.org/doc/qt-5.1/qtdoc/requirements-win.html http://qt-project.org/doc/qt-5.1/qtopengl/qtopengl-index.html http:// blog.qt.digia.com/blog/2012/10/24/graphics-on-windows-from-a-different-angle/ http://blogs.msdn.com/b/chuckw/archive/2012/05/ 07/hlsl-fxc-and-d3dcompile.aspx