简介:Qt Quick图形引擎的底层原理

Qt对各操作系统底层的渲染接口进行了封装,如下图所示:

上图中,越上面的层次,越靠近操作系统/硬件,越下面的层次,越靠近用户。

其中:QRhi是Qt渲染硬件接口,是:Qt Rendering Hardware Interface的缩写。它负责将图形渲染工作转换为目标平台上可用的图形Api指令。

QRhi支持的硬件图形接口如下所示(也就是说它对下面这些硬件接口进行了封装):

  • OpenGL (version 2.1或更高版本)

  • OpenGL ES (version 2.0或更高版本)

  • Vulkan (version 1.0或更高版本)

  • Direct3D 11 (version 11.1或更高版本)

  • Direct3D 12 (version 12.0或更高版本)

  • Metal (version 1.2或更高版本)

Qt 会尽可能使用目标平台的硬件接口,比如,在Windows平台上使用Direct3D,在Mac平台上使用Metal。但也允许开发人员自己指定硬件接口,如下代码所示(明确使用Vulkan渲染接口进行渲染):

QQuickWindow::setGraphicsApi(QSGRendererInterface::Vulkan);

Qt Quick使用场景图技术渲染界面(Scene Graph)。我们通过一个例子来介绍这个技术,比如,一个这样的图形+文字列表

如果使用传统的QPainter来渲染的话,它的工作步骤大概率会是:

  1. 渲染第一个图标,渲染第一行文字。

  2. 渲染第二个图标,渲染第二行文字。

  3. 渲染第三个图标,渲染第三行文字。

如果使用场景图技术来渲染的话(Qt Quick渲染),它的工作步骤大概率会是:

  1. 渲染三个图标。

  2. 渲染三行文本。

对于操作系统的硬件接口来说,连续渲染三个图像,比分开渲染三个图像要高效的多。甚至Qt的Rhi层会把三个图像的渲染工作转换成一个硬件指令提交给硬件接口。

QPainter 的优势是可以在渲染每一帧时完成成千上万次单独的绘制指令,而如果要让 OpenGL 和其他硬件接口的性能表现更好,则应尽可能减少硬件 API 的调用次数。

搞不好这一点,那就有可能造成使用GPU的性能表现还不如不使用它的现象。

现在我们介绍一下Qt的底层实现方式:

Qt会把待渲染的元素组成一棵树(QSGNode 数据结构)。在这个结构中,每个节点都有自己的位置、大小、变换方式(旋转、缩放、平移等)等属性。

每次更新时,Qt都会遍历整棵树检查元素的变化情况(是不是“脏”了)。

检查完元素后,就会生成实际的绘制命令(用一个指令渲染三个图像就是在这个阶段优化完成的),这些命令会被传递到渲染管线中。

当遍历每个元素的状态并生成下一帧的渲染指令时,Qt可能还在专门的渲染线程上渲染上一帧的内容(Qt会在这个环节丢弃某些不必要的帧),“并行处理”也是场景图技术性能更高的原因之一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liulun

如果文章真帮到了你,谢谢您打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值