QtGraphs:Qt 用于以二维和三维图形可视化数据的最新模块

作者:Sami Varanka | Nov 20, 2024 2:43:08 AM

本博文介绍了 Qt 用于以 2D 和 3D 图形可视化数据的最新模块。该模块被命名为 QtGraphs,它将在 Qt 6.8 发布时正式脱离技术预览版。该模块将二维和三维数据可视化集成到一个包中,有效取代了 Qt 5 早期推出的 QtCharts 和 QtDataVisualization 模块。通过合并这些模块,用户可以更直观、更方便地找到满足其所有数据可视化要求的适当模块。

呈现方面的改进
创建 3D 数据可视化模块时,Qt 还不具备今天这样复杂的图形抽象和 3D 呈现引擎。因此,我们专门为 QtDataVisualization 创建了一个定制的 OpenGL 渲染引擎。由于渲染引擎需要兼容 OpenGL ES 2 的设备,因此缺乏现代 OpenGL 功能,如实例渲染。此外,由于渲染引擎使用 OpenGL,因此 Ui 组件也必须使用 OpenGL。强制应用程序使用 OpenGL 会导致在拥有更好图形替代方案(如 Windows 上的 Direct3D)的平台上出现性能不佳的情况。QtGraphs 的 3D 方面并不局限于 OpenGL,因为它使用 Quick3D 来实现图形的可视化。QtCharts 与 Widget 框架高度耦合,因为它使用了图形视图框架。这通常意味着要使用软件渲染解决方案。但是,由于 QtGraphs 基于 Quick 框架工作,因此 2D 图形使用了硬件加速呈现。

三维数据 API 的更改
QtDataVisualization 和 QtGraphs 之间的更改不仅体现在引擎盖下,因为数据 API 已进行了重大修改。旧的 API 需要对新的数据数组进行堆分配。但现在,所有数据都可以在堆栈中分配,并利用移动语义来避免不必要的数据复制。除了这些 API 变化外,代理的使用现已更加明确。在 QtDataVisualization 中,代理包含提供给系列的数据。然而,代理不应持有数据,而应充当传递数据的中间层。在 QtGraphs 中,数据仍会传递给代理,但它们会立即将数据提供给系列,而不是存储数据。

小工具支持
QtGraphs 仍可与 QtDataVisualization 等小工具一起使用。不过,两者之间存在一些差异。由于 Quick3D 使用 Quick 渲染基础架构,因此应使用 QQuickWidgets 而不是普通的 QWidgets。在 TP 中使用 QtGraphs 时,每个图形都继承了 QQuickWidget。然而,这种设计并不理想,因为它对小部件框架产生了硬性依赖。因此,设计改为使用组合而非继承。

交互
QtGraphs 保留了与 QtDataVisualization 相同的 3D 图形交互方法,但其实现已大大简化。以前,QtDataVisualization 使用 QAbstract3DInputHandler、QInput3DHandler 和 QTouch3DInputHandler。现在,只需一个类 QGraphsInputHandler 即可整合所有快速输入处理程序。QtCharts 将来自 QuickItem 的事件转换为图形场景事件,而 QtGraphs 中的 2D 侧现在可以直接使用来自 QQuickItem 的事件。

对主题的更改
以前,主题对应用程序的视觉方面(如颜色、可见性、照明和字体)拥有过多的控制权。例如,通过设置浅色主题,即使平台使用的是深色方案,图形的所有颜色也可以更改为浅色。在 QtGraphs 中,Q3DTheme 类型已被 QGraphsTheme 所取代,二维和三维图形都使用它。QGraphsTheme 被分为两个不同的逻辑部分:配色方案和主题。

配色方案控制主图形对象以外的颜色,如背景、绘图区域、网格线、标签背景和文本。配色方案有三种值:浅色、深色和自动。自动配色方案遵循平台的配色方案。我们的用户体验团队对配色方案和所有预设主题进行了现代化处理,以遵循 Qt 中使用的当今标准。

新功能
使用 QQuick3D 实现了 QtGraphs3D,从而实现了一些新功能。

我们现在可以将其他 QQuick3D 元素集成到图形中。使用 importScene 属性,我们可以将任何模型、灯光、粒子发射器和反射探针集合添加到图形场景中。同样,我们还可以扩展场景环境,例如使用色调映射模式、后期处理效果或天空盒。

QtGraphs现在还支持 Bars3D 和 Scatter3D 的透明度。由于已知问题,目前不支持 Surface3D 的透明度,但稍后会添加。

三维图形性能

QtGraphs一直致力于增强所有三维图形类型的性能。对于条形图和散点图,我们现在可以利用 QtQuick3D 提供的模型实例化功能来有效地显示大量条形图或点。QtGraphs 仍支持非实例化渲染,可使用 optimizationHint:Legacy 属性启用。对于曲面图形,我们已将顶点定位任务转移到顶点着色器,利用 GPU 的强大功能来完成此操作。

为了验证改进效果,我们设计了一个性能测试。该测试实例化了一个从 100 个点开始并不断变化数据的图形。在固定时间内测量场景的 FPS,然后对测量结果进行汇总。然后增加图形中的点数,并重新测量图形的 FPS。此过程针对每种图形类型皆进行测试。

QtGraphs 中的条形图和散点图以实例化和非实例化配置运行,而QtDataVizualization 中则使用静态和动态配置。

测试在配备 Intel I7-8700 CPU 和 NVIDIA Quadro 4000 GPU 的 Linux 机器上运行。
使用 OpenGL 作为 QtGraphs 的 RHI 后端,并在所有测试中关闭了 VSync。
MSAA 设置为 4x,并在测试中关闭了阴影。








虽然 3D 图形的传统配置 性能弱于默认数据可视化,但默认 3D 图形配置的每个图形的平均 FPS 明显更高,这表明新技术显著提高了性能

未来发展

QtGraphs 将继续开发新功能,并已在考虑中。例如,虽然可以将 3D 元素嵌入图形,但还无法将图形嵌入 QQuick3D 场景。参数样条线渲染是另一项已在开发中的功能。对于二维图形,即将推出的一项功能是可以更改 x 轴是显示在图形的顶部还是底部。同样,Y 轴也可以从左到右更改。