据我了解,在早期的 Qt 版本中没有模块,有不同功能的单独类,包括图形。在 qt 1.2 中实现了对 Opengl 的支持。但是,QPainter、QImage 存在于早期版本中。那么,说这些类是原生的(换句话说,是原始的类)是否正确?opengl 类 - 非本地(毕竟它是一个独立的分支)?我想了解 Qtopengl 的进一步演变,作为创建 2D 图形 ih Qt 的非本地和替代方法,该模块对本地方法(用于创建 2D 图形)的演变的影响。
2 回答
如果“本机”是指“硬件辅助”,那么这条线就不再那么清楚了。请注意,QPainter
可以使用各种绘制引擎进行绘制,因此仅使用 aQPainter
本身并不意味着任何事情。
如果通过“硬件辅助”仅仅意味着使用 CPU 的传统整数或浮点执行单元以外的东西,那么是的,光栅绘制引擎确实使用了各种可用的 SIMD/矢量操作。光栅绘制引擎是用于在GL 和非 GL上绘制QImage
的引擎。QPixmap
QWidget
如果“硬件辅助”是指“由显卡硬件渲染”,那么您需要使用 OpenGL 绘制引擎。当您在 aQGLWidget
或 a 中绘画时使用它QQuickPaintedItem
。当然,绘画仍然是由软件定义的——几何设置和着色器只是代码!该软件在可以比通用 CPU 更快执行的硬件上运行。
鉴于现在固定功能的 OpenGL 管道或多或少是一个历史产物,因此可以说Qt 中的所有渲染都是使用纯软件技术完成的,但该软件可以在通用 CPU 上运行,这并不是错误的,或者利用通用 CPU 上的 SIMD/向量执行单元,或者可以在 GPU 上运行。
还应该说,如今典型的 Windows 驱动程序除了 blits 之外不会加速 GDI/gdiplus 绘图。因此,当使用光栅引擎进行 2D 绘图时,尤其是在 XP 等较旧的 Windows 版本上,Qt 可以比平台原生 2D 绘图更快。
那么,说这些类是原生的对吗?
不它不是。
原因是“本地”对不同的人意味着不同的事情。这是解释的问题。看看你的另一个问题我们有多困惑。
到目前为止,我认为您的意思是本机的“非opengl”2/3D。这可能意味着软件光栅化,而不是直接通过显示驱动程序。所以,仍然在 Qt 级别,但没有 Qt 中的 opengl 类。
现在,这就是我们可以回到 QImage 和 QPainter 的地方。是的,QPainter 基本上是软件光栅化的第一代,当时 GPU 不像现在这么普遍和便宜。
他们基本上是纯粹使用软件技术进行渲染。也就是说,它更受限制,但它可以在没有更昂贵和不太常见的硬件的情况下工作。
(那是 Quake 和其他软件产品的时代,从今天的角度来看是有趣的时代......)