Qt学习之路:Qt绘制系统简介

1、参考:Qt 绘制系统简介:

https://www.devbean.net/2012/10/qt-study-road-2-paint-sys/
总结:
Qt的绘图系统允许使用相同的 API 在屏幕和其它打印设备上进行绘制。其整个绘图系统是基于 QPainter,
QPainterDevice 和 QPaintEngine 三个类。
其中可以把 QPainter 理解成画笔;把 QPaintDevice 理解成使用画笔的地方,比如纸张、屏幕等;而对于
纸张、屏幕而言,肯定要使用不同的画笔绘制,为了统一使用一种画笔,我们设计了QPaintEngine类,这个
类让不同的纸张、屏幕都能使用一种画笔。
QPainterDevice子类有QImage、QOpenGLPaintDevice、QWidget、QPixmap等,QOpenGLPaintDevice使用当前的QOpenGL上下文渲染QPainter绘制命令,几乎始终是硬件加速的。

2、QPaintEngine类:

QPaintEngine 类提供了抽象定义 Painter 的绘制到给定的平台上给定设备。Qt 为我们支持的不同绘
画后端提供了 QPaintEngine 的几种预制实现。比如:提供的主要绘制引擎是光栅绘制引擎,包含一个软件
光栅化程序;也为 OpenGL 和打印提供了QPaintEngine一些实现。
自定义 QPainter 绘制到某一个后端,则必须继承 QPaintEngine 的子类并重新实现其所有虚拟功能。
QPaintEngine由创建它的QPaintDevice创建并拥有。

QPaintEngine已经支持了哪些类型的绘制引擎?
QPaintEngine::Type
QPaintEngine::OpenGL2
QPaintEngine::PaintBuffer
QPaintEngine::Direct3D //Windows only, Direct3D based engine
等等

3、怎样指定 QPainter 使用 QPaintEngine::OpenGL2 绘制引擎?

① 首先了解 QPainter 与 QPainterEngine 实现的关系图:
参考:
绘图引擎QPainterEngine:https://blog.csdn.net/weixin_34221036/article/details/91608541
总结:
在QT中所有的绘图操作都是通过QPainter来完成的,甚至QT自身所有控件窗口的绘制都是通过QPainter绘制显示。另外QPainterDevice为作为绘图设备存在。其实最后所有的操作都是通过QT自身的QPainterEngine来实现绘制渲染。

② 指定绘制引擎的方式:
在 QT5 中可以通过 QPA 来指定不同平台,对于不同平台的 QPainterEngine 就有不同的实现方式。
QT_QPA_PLATFORM 可指定的平台:EGLFS, LinuxFB, DirectFB, Wayland。

QPA 环境变量说明手册:
Qt5.9.7$ grep “QT_QPA_PLATFORM” . -rnw
./Src/qtdoc/doc/src/platforms/emb-linux.qdoc
试验测试:
$ ./hello -platform [eglfs | linuxfb] &;
$ top -H 查看进程内线程运行,并按’1’看多cpu情况
开启相同功能时总结:
① 在 linuxfb 平台运行时,qui_main对一个cpu占用率99.3%。
② 在 eglfs 平台运行时,qui_main对一个cpu的占用率22%。
③ 说明 eglfs 平台下 QPainter 选择了 QPaintEngine::OpenGL2 绘制引擎。

注意:QPainter在GPU设备上,将不能发挥GPU的全部实力。
QT嵌入式平台配置:http://www.mamicode.com/info-detail-1618722.html

4、Qt Quick:

参考:QtQuick-场景渲染(Scene Graph):
https://blog.csdn.net/zhushentian/article/details/81279196
总结:
Qt Quick使用场景:
① 在Qt5之前,GUI开发使用的是现在的QtWidgets,ui描述界面布局组合C++细节实现,实现效果很好,界面开发的速度还算中肯。在不具备开发自定义UI又需跨平台的组织和个人面前,几乎是不二选择。
② 但在移动开发面前不灵了,因为QtWidgets本质是使用平台绘图工具来绘绘制界面,而每个界面的绘制都需要各自有自己的绘制状态,这个消耗对于手机这类移动平台来说是不可忽视的。
③ QtQuick主要是改变了界面渲染方式,自QtQuick2起统一使用OpenGL ES 2.0或者OpenGL 2.0 来渲染界面。
好处是:所有要渲染的界面元素均在最后统一提供给OpenGL,极大减少状态切换时间和渲染时间(相比于之前使用QPainter依次为每个界面元素渲染)。
举例来讲:就像写文件,把要写的内容存在缓存后统一写入文件,一定比每次写入都重复打开关闭文件要快。
④ 在很多平台上,渲染线程和GUI线程是不同的两个线程,两个可以并行着来,这点上QtQuick最后统一渲染所有界面又提升了效率。

Qt Quick使用方式:
① Quick可以使用 Qml 框架的程序,Qml基于 GPU 实现了一套渲染框架,这个框架就是 SceneGraph。SceneGraph提
供了很多 GPU 渲染相关的功能,都是以 QSG 开头的类,但是QSG有点难以使用,需要有一定的 OpenGL或DirectX
相关图形学知识,并理解 SceneGraph 的节点交换机制。使用方式是在 QQuickItem 的子类中,重载updatePaintNode函数。
② 如果直接使用OpenGL的API,则提供了 QQuickFrameBufferObject 的一种途径。QQuickFramebufferObject 继承于
QQuickItem 用来在一个framebuffer object(FBO)上做渲染,SceneGraph框架会将这个FBO渲染到屏幕上。只要理解
了渲染流程,用起来还是很方便的。

---- QQuickWidget QQuickWindow QQuickView QQuickItem是 Qt Quick 编程基础类----
arm5728 使用 QtQuick(对比QtWidgets + eglfs平台)开发界面程序能发挥最大效率。

了解:QSG_VISUALIZE

5、QOpenGLWindow的位置:

总结:
① QOpenGLWindow是QWidget和OpenGL的一个桥梁,相当于给用户提供了在Qt中使用OpenGL语言编程接口。它与QOpenGLWidget一样需重新实现initializeGL、resizeGL、paintGL。它结合OpenGL语言函数更多是用于绘制3D场景,而2D图形绘制通常使用QPainter即可。
② OpenGL绘制和QPainter绘制,也称为混合渲染:
混合渲染:https://www.linecg.com/news_7568.html
③ QOpenGLWidget用来在QWidget框架中集成OpenGL渲染,QOpenGLWindow用在Qml框架。
④ Qt对OpenGL系列的函数都做了封装,一般使用QOpenGLFunctions就够了。使用这些functions,一定要
在有OpenGL上下文环境的地方,先调用一下initializeOpenGLFunctions。

发布了41 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/wade_510/article/details/103618441