除了有效使用系统资源之外,3D渲染的速度对于3D引擎也是必不可少的。即将推出的新Qt 3D Studio 2.4版本可显着提升渲染性能,并进一步节省CPU和RAM利用率。使用我们的示例高端嵌入式3D应用程序,渲染速度提高了565%,而RAM使用和CPU负载分别下降了20%和51%。
性能是Qt的关键驱动因素,对于能够在嵌入式设备上运行复杂的3D应用程序尤为重要。我们一直在通过早期版本的Qt 3D Studio 不断提高资源效率,即将推出的Qt 3D Studio 2.4在渲染性能方面迈出了重要一步。确切的性能提升在很大程度上取决于应用程序和使用的硬件,因此我们在本博文中详细介绍了两个示例应用程序和嵌入式硬件。本文中使用的示例应用程序是汽车仪表集群,但在使用Qt 3D Studio运行时的任何应用程序中都可以看到类似的改进。
瑞萨R-Car D3的入门级嵌入式示例
测量中使用的入门级嵌入式设备是 Renesas R-Car D3,它具有Imagination PowerVR GE8300入门级GPU(https://www.imgtec.com/powervr-gpu/ge8300/)和一个ARM Cortex A53 CPU核心。操作系统是Linux。
使用的示例应用程序是低端群集,可从https://git.qt.io/public-demos/qt3dstudio/tree/master/LowEndCluster获得。正如关于优化3D应用程序的详细博客文章中所述,低端群集示例已得到很好的优化。
为了使应用程序尽可能轻量级,只将ADAS视图创建为实时3D用户界面。使用Qt Quick创建组合仪表的其他部分。这使得即使在像Renesas R-Car D3这样的入门级硬件上也可以拥有实时3D用户界面。
采用NVIDIA Tegra X2的高端嵌入式示例
用于测量的高端嵌入式设备是配备Tegra X2 SoC的NVIDIA Jetson TX2开发板,该板具有256核NVIDIA Pascal™GPU和双核NVIDIA Denver 2 64位以及四核ARM Cortex- A57 MPCore CPU。操作系统是Linux。
使用的示例应用程序是Kria集群,可从https://git.qt.io/public-demos/qt3dstudio/tree/master/kria-cluster-3d-demo获得。Kria集群示例故意沉重,具有较大且未完全优化的纹理,高分辨率等。
在高端示例中,所有仪表和其他元素都是实时3D,使用Qt 3D Studio运行时渲染。很少有Qt Quick部件,这些部件通过QML流使用纹理共享进入3D用户界面。
渲染性能提升
新Qt 3D Studio 2.4版本的最大改进是渲染性能 - 使相同的应用程序在同一硬件上渲染更多帧每秒(FPS)。与Qt一样,我们的目标是稳定运行60 FPS,但在嵌入式设备上,纯粹的性能还不够。当存在热管理和处理不同使用场景等项目时,通常不会在SoC的图形功能的边缘运行。对于诸如组合仪表之类的应用,性能需要在所有操作条件下都是平滑的,包括在系统的最大负载下。出于高端示例的测量目的,我们禁用了vsync,允许系统绘制尽可能多的帧。在典型的实际应用程序中,始终存在vsync集,
下图显示了测量的每秒帧数,NVIDIA TX2上的高端示例(vsync off)和瑞萨R-Car D3上的低端示例(vsync on):
高端示例:使用新的Qt 3D Studio 2.4,我们发现渲染性能提升了565%。使用Qt 3D Studio 2.3,应用程序仅以20 FPS运行,但新的Qt 3D Studio 2.4允许应用程序运行133 FPS。这是测量关闭vsync,只是为了测量新运行时的能力。在实践中,运行60 FPS就足够了,并且可以利用处理器的额外容量来具有更大的屏幕(或另一个屏幕)或更复杂的应用 - 或者仅仅通过不使用SoC的最大容量来节省功率。
低端示例: 改进率为46%,因为Qt Quick的最大FPS上限为60 FPS。使用Qt 3D Studio 2.3,应用程序实现了41 FPS,而使用新的2.4运行时,它可轻松达到60 FPS。就像更强大的高端硬件一样,SoC的多余容量可用于运行更复杂的3D用户界面,或者只是不使用。
CPU负载改善
应用程序的总CPU负载是多个事物的总和,其中之一是由3D引擎引起的负载。在嵌入式应用程序中,重要的是在应用程序中使用3D不会导致CPU过载。如果应用程序超出可用CPU,则无法在目标FPS处渲染,并且屏幕上可能出现口吃或其他伪影。
下图显示了在NVIDIA TX2上使用高端示例测量的CPU负载以及瑞萨R-Car D3上的低端示例:
高端示例:使用新的Qt 3D Studio 2.4,与Qt 3D Studio 2.3相比,我们看到CPU负载大幅提升51%,同时FPS从20 FPS提升至133 FPS。运行时2.3的总负载为167%(总计400%),运行时2.4的负载下降到81%。请注意,增加的渲染速度也会影响CPU负载。在vsync on和FPS上限为60 FPS时,CPU负载为74%。
低端示例:我们看到CPU负载仅有5%的适度改善,这主要是由于应用程序主要是Qt Quick。但这是因为FPS同时从41 FPS升至60 FPS。还应该注意的是,R-Car D3的CPU功能不是很强大,因此整个应用程序的FPS增加会对整体CPU负载产生影响。
内存使用改进
对于任何图形,特别是3D,它是通常占用大部分RAM的资产。有一些方法可以优化,最明显的是避免不必要的细节水平和利用纹理压缩。出于本博文的目的,我们不会使用任何特定的优化方法。测量使用完全相同的应用程序完成,除了使用不同版本的Qt 3D Studio运行时之外没有其他任何变化。
下图显示了使用NVIDIA TX2上的高端示例测量的RAM使用情况以及瑞萨R-Car D3上的低端示例:
高端示例:与Qt 3D Studio 2.3相比,新的Qt 3D Studio 2.4减少了48MB。这比应用程序的整体RAM使用量减少了20%。
低端示例: 在更简单的示例中,使用新的2.4运行时,RAM使用量减少了9MB。百分比这是应用程序的整体RAM使用量减少15%。
这是如何实现的?
这些改进确实很大,特别是在嵌入式设备上,所以有人可能想知道新版本中的改变是什么?我们所做的是使用与Qt 3D Studio 1.x版本相同的运行时架构,而不是在Qt 3D上运行。3D引擎的核心逻辑仍然与之前相同,但它直接在OpenGL上运行,而不是使用Qt 3D。这提供了显着改进的性能,尤其是在嵌入式设备上,而且在更强大的桌面系统上。通过直接在OpenGL上运行Studio的3D引擎,我们可以避免渲染开销并简化架构。更简单的体系结构转换为内部信令更少,内存中的对象更少,并且多个呈现线程之间的同步需求减少。所有这些使我们能够对Qt 3D Studio 1进行进一步的优化。
3D运行时的更改不需要对大多数项目进行任何更改。只需更改import语句(导入QtStudio3D.OpenGL 2.4而不是 导入QtStudio3D 2.3)然后用新的Qt 3D Studio 2.4重新编译就足够了。由于API和与应用程序相关的3D引擎部分与之前相同,所有相同的材质,着色器等都像以前一样工作。在极少数情况下需要进行一些更改,例如某些自定义材料,这些变化相当小。
获得Qt 3D Studio 2.4
如果您还没有尝试过Qt 3D Studio 2.4预发行版,那么您应该采取这种方式。它可以在预览节点下的在线安装程序中使用。目前我们已经发布了第三个Beta版,很快就会发布候选版本。最终版本的目标是在6月底之前发布。Qt 3D Studio在商业和开源许可下均可使用。
凉!
我们可以期待Qt3d也能利用这些变化吗?目前Qt3d的表现还不错。对于有许多物体的大场景,渲染器远不及像Godot这样的其他3D引擎的性能。
干杯
@Eli:遗憾的是,由于结构上的差异,无法利用Qt 3D进行这些改进。
“我们所做的是使用与Qt 3D Studio 1.x版本相同的运行时架构,而不是在Qt 3D上运行。3D引擎的核心逻辑仍然与之前相同,但它直接在OpenGL上运行,而不是使用Qt 3D。“
这是否意味着Qt3D的结束?难道我们不能拥有一个清晰直观的声明性3d层,它在易用性和性能之间取得了适当的平衡吗?直接使用OpenGL就像在Qt C ++中编写程序时一样编程......在编程语言中类比:我并不主张通过Java获得的易用性或更糟糕的javascript(无骨架语言如此非结构化,如此敏捷,如此前卫,最好的框架称为BACKBONE :))))Qt3D不是IT,不是那种神奇的平衡吗?好难过…
@Dediu:不,这对Qt 3D没有影响。它继续是完全支持的模块,具有自己的编程API。只是Qt 3D Studio 2.4运行时不再使用Qt 3D,而是直接适应OpenGL。对Qt 3D的任何其他用户没有影响。
嗨Tuukka Turunen感谢您回答我们的问题
相关文章