翻译:林查德(Richard Lin)
您知道,Qt已启动了一个名为Qt Quick 3D的新模块,该模块基于QML API向Qt Quick添加了3D绘图功能(预计Qt 6中将提供C ++ API)。这将对Qt 3D产生什么影响,以及将来如何将其定位在Qt世界中?
我希望本文和后续文章能够回答这个问题,同时提供对我们对Qt 3D正在进行的改进的深入介绍。本文将重点介绍即将发布的Qt5.x方面的改进,而下一篇文章将介绍我们将在Qt 6时代对Qt 3D进行的一些研究和改进。
如何找到Qt 3D?
Qt 3D是一个灵活的框架。因此,它很少限制您要渲染的内容和方式。与任何技术选择一样,这是有利有弊,需要折衷和权衡。
缺点是,与其他Qt模块相比,Qt 3D要求开发人员具有更多的知识。您可能会遇到需要以比预期更快的速度在框架图上实属粗糙材料。它使您可以轻松地加载和查看网络上各种格式的模型,并通过应用程序数据进行控制。
由于外部代码的贡献,Qt 3D内置了部分但完全兼容的glTF2格式支持,因此工作量非常大,并且需要与Qt3DExtras完全不同的材质处理方法。

Qt 3D的计划是什么?
首先,我想说明Qt 3D不会消失。 Qt 3D正在Kuesa和其他项目中使用,其他公司甚至在一些非常大型的商业应用中使用Qt 3D。
我们知道Qt 3D存在很多性能问题。您可能已经看到了有关Gerrit的许多更新,我们已经非常努力地解决了这些问题。让我们简要梳理正在发生的事情和未来的计划。
多线程体系结构
从一开始,Qt 3D就被设计为多线程模式。通常这是一件好事,但是随着异步性的增加,事情变得棘手。在某些没有好的内存分配器或信号量实现不理想的低端嵌入式硬件上,实际上可能会妨碍多线程。
为了提高性能,我们在Qt5.14中删除了所谓的Aspect Thread。仍然有一个线程池可以并行化任务处理,但是可以由环境变量控制。
在常规场景中删除帧缓冲对象(FBO)
在执行3D内容渲染和覆盖2D UI的常规场景中,Qt 3D不再只能使用帧缓冲区对象(FBO)。此方法首先将3D内容渲染到附加到FBO的颜色纹理(和深度纹理)上,FBO是OpenGL必须设置的渲染目标。然后,Qt Quick将相同的颜色纹理映射到简单的四边形,最后将其与Qt Quick 2场景的其余部分进行合成。
此方法在台式机和许多设备上都没有问题。但是,某些设备的FBO实现非常差,这将大大降低性能。如果3D内容严格位于UI之下并且使用简单的渲染方法(通常是正向渲染),则我们可以对其进行优化,并避免完全使用FBO代码路径。此时,我们可以命令Qt 3D直接在屏幕上绘制,因为我们知道所有Qt Quick内容都会在此基础上被覆盖。要启用此优化,您应该使用Scener3D的新compositingModeproperty(来自Qt5.14)并将其设置为Underlay。非常感谢Giuseppe D'Angelo所实现的目标,以及Paul Lemire的整合。
优化通知系统(Notification System)
第三个仍在进行中的大更改区域是更改我们在Qt 3D的前端和后端发送/接收属性更改通知的方式。到目前为止,这是通过为每个属性更改传递类似事件的数据包来实现的。在具有成千上万个实体和许多属性的大型场景中,这可能会导致性能陷入泥潭并成为瓶颈。
在考虑了各种选择之后,Mike Krus和Paul Lemire非常努力地重新设计了这个重要的子系统,以提高性能。新机制基于前端和后端对象变脏后直接同步的原理。这允许一次更新对象上的所有属性,而不是每个调用仅更新一个属性。当前的基准测试结果表明,在场景(数千个实体)中,属性更改通知的分布已加快了200%至300%。
如果一切顺利,上述更改将在将来的Qt5.14.x版本中实现。
摘要
除了上述改进之外,我们还在整个代码库中引入了许多小的改进。例如,现在仅当帧图中发生实质性影响输出的变化时才发生帧图的遍历。还有一些优化仅在更改制服值时才会更新。
在Qt5.14系列中,我们对Qt 3D进行了许多优化,并且将来还会有更多优化。这些改进大大减少了CPU渲染帧时的额外CPU开销,同时减少了线程同步的次数,因为线程同步可能会导致某些系统浪费时间。
在下一篇文章中,我们将深入研究如何在Qt 6中改进Qt 3D,以及如何使用现代图形API来实现更高的性能。
别忘了分享此帖!
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-322411-1.html
今早起來又能聯網了不知這是要鬧哪樣