Qt 渲染机制

您所在的位置:网站首页 qgraphicsview框架 Qt 渲染机制

Qt 渲染机制

#Qt 渲染机制| 来源: 网络整理| 查看: 265

作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

前言

众所周知,Qt 是一个跨平台C++图形用户界面应用程序开发框架,我们使用 Qt 最多的就是用来开发GUI程序。在HMI开发过程中,最直接影响人们审美的就是程序的流畅程度,即应用程序在交互过程中是否会出现延迟或者卡顿。而这些都涉及到了一个知识点,就是 Qt 中的渲染机制,了解 Qt 是如何完成渲染的,会给我们的开发带来很大的帮助。

了解 OpenGL 渲染

GPU(GraphicProcessing Unit)图形处理器,其最大的作用就是进行各种绘制计算机图形所需的运算,包括顶点设置、光影、像素操作等。GPU使显卡减少了对CPU的依赖,并进行部分原本CPU的工作。

实际应用中图像的生成流程大致如下: 首先从硬盘中读取模型,CPU分类后将多边形信息交给GPU,GPU再时时处理成屏幕上可见的多边形,但是没有纹理只有线框。CPU计算出模型后,GPU将模型数据放进显存,显卡同时也为模型贴材质,给模型上颜色。CPU相应从显存中获取多边形的信息。然后CPU计算光照后产生的影子的轮廓。等CPU计算出后,显卡的工作又有了,那就是为影子中填充深的颜色。周而复始,完成CPU与GPU之间的数据交换。

在这里插入图片描述 OpenGL是一个跨平台的图形接口,OpenGL是和显卡有关系的,只有显卡提供支持,才可以用OpenGL的,当然OpenGL是和显卡厂商有协商的。有了OpenGL,我们就可以用显卡来处理关于图形图像的东西,然后交给显示服务器进行显示。

这里有个问题需要注意,就是OpenGL不能直接和显示服务器进行通信,也就是说我们用OpenGL处理的图形图像是不能直接给显示服务器的,这中间得有一个东西来进行处理,这个中间件根据平台,windows上叫做wgl,linux上叫做glx,macos上是agl。好了,现在我们就可以用窗口来显示OpenGL处理的图形了,也就是我们常说的用OpenGL来进行渲染。

之后为了将wgl,glx,agl这些东西统一起来,实现平台统一,就诞生了glfw,glu等东西,这些东西封装了wgl,glx,agl并且结合了各平台的显示服务器来创建窗口,可以让我们用一套代码来实现跨平台使用OpenGL在窗口中进行渲染。

然后问题又来了,因为OpenGL在各个操作系统上的接口有的不一致,如果在不同平台上编译可能不相互兼容。于是又诞生了glew和glad这类东西来实现各个操作系统OpenGL接口的统一,结合上面提到的,就可以实现全面的跨平台了。

Qt 中的渲染

QWidget 在Qt5.0之前,GUI开发使用的都是现在的 QWidget,ui描述界面布局结合C++细节实现,实现效果很好,界面开发的速度还算中肯。但在移动开发面前就不灵了,因为 QWidget 本质是使用平台绘图工具来绘绘制界面,而每个界面的绘制都需要各自有自己的绘制状态,这个消耗对于手机这类移动平台来说是不可忽视的 。 在 QWidget 这一类中,基本上控件的实现都是对各个平台上的对应的控件的封装。QWidget 中使用 QWindow 来创建窗口,而单独的 QWindow 内是不能使用系统插件的,只提供窗口,所以理论上 QWindow 中是可以直接用 OpenGL 来进行绘图的。Qt 为了以后的发展和2D,3D绘图性能的提升以应对游戏等开发需求,在Qt5.0以后将 QWidget 系的东西从gui模块中单独抽出来作为widgets模块,这也在情理之中。可参考 Qt中 gui 模块和 widgets 模块的区别

QGraphics Qt为了提升针对大量简单组件的渲染性能,创造了QGraphics这一类东西,但是他们仍然是属于widgets模块的,也不一定是用OpenGL渲染,如果想用OpenGL渲染,是需要在 QWidget 和 OpenGL 之间搭一个桥梁,这就是 QGLWidget。

QQuick Qt4 中的 QtQuick 1.x 更接近widget,虽然是Griphics/view,但是渲染更多是优先提交给cpu处理。 自 Qt Quick 2.x 起统一使用OpenGL ES 2.0 或者 OpenGL 2.0来渲染界面。渲染方式更倾向于优先使用显卡,通过硬件来加速,所以现在使用QML需要良好的显卡支持,例如正确安装显卡驱动。这样做的好处是,所有要渲染的界面元素均在最后统一提供给OpenGL,极大减少状态切换时间和渲染时间(相比于之前使用QPainter依次为每个界面元素渲染,不断地重复渲染状态)。举例来讲,就像写文件,把要写的内容存在缓存后统一写入文件,一定比每次写入都重复打开关闭文件要快。

更多内容,请查看 QML 渲染机制


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3