QQuickGraphicsConfiguration Class
QQuickGraphicsConfiguration 用于控制QQuickWindow 的底层图形设置。更多内容...
| 标题: | #include <QQuickGraphicsConfiguration> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Quick) target_link_libraries(mytarget PRIVATE Qt6::Quick) |
| qmake: | QT += quick |
| 自: | Qt 6.0 |
公共函数
| QQuickGraphicsConfiguration() | |
| ~QQuickGraphicsConfiguration() | |
| QByteArrayList | deviceExtensions() const |
(since 6.5) bool | isAutomaticPipelineCacheEnabled() const |
| bool | isDebugLayerEnabled() const |
| bool | isDebugMarkersEnabled() const |
| bool | isDepthBufferEnabledFor2D() const |
| QString | pipelineCacheLoadFile() const |
| QString | pipelineCacheSaveFile() const |
| bool | prefersSoftwareDevice() const |
(since 6.5) void | setAutomaticPipelineCache(bool enable) |
(since 6.5) void | setDebugLayer(bool enable) |
(since 6.5) void | setDebugMarkers(bool enable) |
| void | setDepthBufferFor2D(bool enable) |
| void | setDeviceExtensions(const QByteArrayList &extensions) |
(since 6.5) void | setPipelineCacheLoadFile(const QString &filename) |
(since 6.5) void | setPipelineCacheSaveFile(const QString &filename) |
(since 6.5) void | setPreferSoftwareDevice(bool enable) |
(since 6.6) void | setTimestamps(bool enable) |
(since 6.6) bool | timestampsEnabled() const |
静态公共成员
(since 6.1) QByteArrayList | preferredInstanceExtensions() |
详细说明
QQuickGraphicsConfiguration 类是一个用于存储低级图形设置的容器,这些设置会影响Qt Quick 场景图对底层图形 API(如 Vulkan)的初始化方式。它还可以控制场景图渲染器的某些方面。
注意: 在QQuickWindow 上设置QQuickGraphicsConfiguration必须 足够早,即在该窗口的场景图首次初始化之前完成。对于屏幕窗口,这意味着必须在调用QQuickWindow 或QQuickView 的show()方法之前完成该操作。对于QQuickRenderControl ,必须在调用initialize()之前完成配置。
外部渲染引擎或 XR API 的配置
在构建并显示使用 Vulkan 进行渲染的QQuickWindow 时,需通过 Vulkan API 初始化 Vulkan 实例(VkInstance )、物理设备(VkPhysicalDevice )、设备(VkDevice )以及相关对象(队列、池)。 当使用QQuickRenderControl 将渲染重定向到自定义渲染目标(例如纹理)时,情况也大致相同。虽然此时QVulkanInstance 的构建由应用程序控制,但其他图形对象的初始化在QQuickRenderControl::initialize()中的处理方式,与屏幕渲染器QQuickWindow 完全一致。
对于大多数应用程序而言,无需进行额外配置,因为Qt Quick 为许多低级图形设置(例如应启用哪些设备扩展)提供了合理的默认值。
不过,这并不总是足够的。在高级用例中,当集成直接的 Vulkan 或其他图形 API 内容时,或者与外部 3D 或 VR 引擎(例如 OpenXR)集成时,应用程序可能需要针对细节(例如应启用哪些设备扩展)指定自己的设置集。
本类正是为此而设计。它允许指定设备扩展列表,当使用 Vulkan 或适用该概念的其他图形 API 时,场景图会自动采用该列表。对于不适用的概念,相关设置将被直接忽略。
此类函数的示例包括setDeviceExtensions()和preferredInstanceExtensions()。后者在应用程序自行管理QVulkanInstance 并通过QWindow::setVulkanInstance()将其与QQuickWindow 关联时非常有用。
Qt Quick 场景图渲染器配置
另一类设置与场景图的渲染器相关。在某些情况下,应用程序可能需要控制特定行为,例如在渲染 2D 内容时使用深度缓冲区。 在 Qt 5 中,此类设置要么完全无法控制,要么通过环境变量进行管理。在 Qt 6 中,QQuickGraphicsConfiguration 为这些设置提供了新的配置中心,同时在适用情况下仍保留对传统环境变量的支持。
此类设置的一个示例是 `setDepthBufferFor2D()`。
图形设备配置
当 Qt 在初始化 `QQuickWindow` 时创建图形实例和设备对象(例如 Vulkan 中的 `VkInstance` 和 `VkDevice`、Direct 3D 中的 `ID3D11Device` 等)时,应用程序或库在某些情况下可能需要控制某些设置。
在 Qt 6.5 之前,其中一些设置可通过环境变量进行控制。例如,QSG_RHI_DEBUG_LAYER 或QSG_RHI_PREFER_SOFTWARE_RENDERER 。这些环境变量仍然可用,并且继续按原样工作。此外,QQuickGraphicsConfiguration 还提供了 C++ 设置器。
例如,以下 main() 函数在打开QQuickView 时,同时指定应启用 Vulkan 验证或 Direct3D 调试层:
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQuickGraphicsConfiguration config;
config.setDebugLayer(true);
QQuickView *view = new QQuickView;
view->setGraphicsConfiguration(config);
view->setSource(QUrl::fromLocalFile("myqmlfile.qml"));
view->show();
return app.exec();
}管道缓存的保存与加载
Qt Quick 支持将图形/计算管道缓存存储到磁盘,并在应用程序后续运行时重新加载。管道缓存的具体内容、查找机制以及实际被加速的内容,均取决于 Qt RHI 后端以及运行时使用的底层原生图形 API。 不同的 3D API 在着色器、程序和管道状态对象以及相应的缓存机制方面有着不同的概念。此处的高级管道缓存概念将这一切抽象为将单个二进制数据块存储到文件中并从文件中检索出来。
注意:将 缓存存储 在磁盘上可在应用程序后续运行中带来性能提升,有时甚至非常显著。
当遇到与前一次运行相同的着色器程序和/或管道状态时,系统很可能会跳过许多操作,从而加快着色器和材质的初始化速度,这意味着启动速度可能更快,渲染过程中的卡顿和“跳帧”现象也可能减少或避免。
当使用不支持或无法检索和重新加载管道缓存(或着色器/程序二进制文件)的图形 API 时,尝试使用文件保存和加载缓存将毫无效果。
注意:在 许多情况下,检索到的数据依赖于且与图形驱动程序(以及可能与其确切版本)紧密相关。 Qt 会通过在管道缓存文件中存储额外的元数据,自动执行必要的检查。如果文件中的数据与运行时的图形设备和驱动程序版本不匹配,其内容将被透明地忽略,应用程序不会察觉。因此,引用在其他设备或驱动程序上生成的缓存是安全的。
驱动程序依赖性问题也有例外,最显著的是 Direct 3D 11,其中“管道缓存”仅用于存储运行时 HLSL 到 DXBC 编译的结果,因此与设备和供应商无关。
在某些情况下,为了优化应用程序的首次运行,可能需要通过“预填充”缓存来提升性能。这可以通过分发从前一次运行中保存的缓存文件,并在另一台机器或设备上引用该文件来实现。 这样,应用程序或设备在首次运行时,便已具备在生成缓存文件的运行中曾用过的着色器程序/管道。 只有当目标系统上的设备和图形驱动程序与之前相同,分发和部署缓存文件才有意义;否则,如上所述,如果设备或驱动程序版本不匹配(D3D11 除外),缓存文件将被忽略。
一旦加载了缓存内容,应用程序仍有可能构建在先前运行中未曾遇到过的图形和计算管道。在这种情况下,缓存会扩大,并向其中添加相应的管道/着色器程序。 如果应用程序还选择保存内容(甚至可能保存到同一个文件中),那么新旧管道都会被存储下来。每次运行时从同一个文件加载并保存到同一个文件,将使缓存不断扩大,从而存储所有遇到过的管道和着色器程序。
实际上,Qt 管道缓存预计会映射到以下原生图形 API 功能:
- Vulkan -VkPipelineCache- 保存管道缓存实际上是将从vkGetPipelineCacheData 获取的 blob 存储起来,并附带额外的元数据以安全地识别设备和驱动程序,因为管道缓存 blob 依赖于具体的驱动程序。
- Metal -MTLBinaryArchive- 启用管道缓存保存功能后,Qt 会将遇到的所有渲染和计算管道存储到 MTLBinaryArchive 中。保存管道缓存时,会存储从归档中检索到的 blob,并附带用于标识设备的元数据。注意:目前由于某些硬件和操作系统版本存在各种问题,macOS 和 iOS 上已禁用 MTLBinaryArchive。
- OpenGL - 该接口不存在原生的管道概念,“管道缓存”存储的是通过glGetProgramBinary 获取的一组程序二进制文件。这些程序二进制文件被打包成单个 blob,并附带额外元数据以标识设备、驱动程序及其版本(即二进制文件的来源)。 程序二进制文件的持久缓存机制在 Qt 中并非新功能:Qt 5 中的 `QOpenGLShaderProgram` 已具备类似功能,例如参见addCacheableShaderFromSourceCode()。 事实上,在 Qt 6 中,当使用Qt Quick 配合 Qt OpenGL 时,该机制始终处于激活状态。但是,当使用此处提供的新型、与图形 API 无关的管道缓存抽象时,Qt 5 时代的程序二进制缓存会自动禁用,因为相同的内容现在已被打包到“管道缓存”中。
- Direct 3D 11——该标准中不存在管道的概念,也不支持为第二阶段编译(即将供应商独立的中间字节码编译为设备特定指令集)检索二进制文件。 驱动程序通常会在该层级采用自己的缓存系统。相反,Qt Quick 的“管道缓存”用于加速那些包含HLSL源代码且需要先编译为中间字节码格式的着色器场景。 对于在运行时组合着色器代码的应用程序和库而言,这可以带来显著的性能提升,因为如果遇到 HLSL 着色器时其字节码已存在,则在后续运行中便可避免可能耗时且未被缓存的D3DCompile()调用。 一个很好的例子是Qt Quick 3D ,其中材质运行时生成的着色器意味着必须处理 HLSL 源代码。因此,在包含一个或多个View3D 项的场景中,保存并重新加载Qt Quick 管道缓存可以带来显著的性能提升。 一个反例可能是Qt Quick 本身:由于大多数用于 2D 内容的内置着色器在构建时就附带了由 DirectX 生成的字节码,因此缓存不会带来任何显著的性能提升。
所有这些都与QtShader Tools模块及其命令行工具(如qsb )执行的着色器处理无关。以 Vulkan 为例。 将兼容 Vulkan 的 GLSL 源代码在离线或构建时(通过 qsb 或 CMake 直接)编译为 SPIR-V 是一个不错的选择,因为这样可以避免在运行时进行耗时的源代码编译。不过,SPIR-V 是一种与供应商无关的中间格式。 在运行时构建图形或计算管道时,很可能会进行另一轮编译,即从中间格式编译为 GPU 的供应商特定指令集(这可能还取决于图形管道中的特定状态以及渲染目标)。管道缓存有助于优化这一后阶段。
注意:许多 图形 API 实现都会采用自己的持久性磁盘缓存,且对应用程序是透明的。在这种情况下,使用Qt Quick 的管道缓存功能可能会带来性能提升,但收益可能较小。
调用setPipelineCacheSaveFile() 和setPipelineCacheLoadFile() 来控制QQuickWindow 或QQuickView 将管道缓存保存到哪些文件中,以及从哪些文件中加载管道缓存。
要了解启用管道缓存磁盘存储的效果,请通过环境变量QSG_INFO=1 ,或同时启用qt.scenegraph.general 和qt.rhi.general 日志类别,来启用最重要的场景图和图形日志。关闭QQuickWindow 时,会出现如下日志消息:
Total time spent on pipeline creation during the lifetime of the QRhi was 123 ms这可以大致反映在窗口生命周期内,图形和计算管道的创建(可能包括着色器编译的各个阶段)所花费的时间。
当启用从管道缓存文件加载时,会显示以下消息进行确认:
Attempting to seed pipeline cache from 'filename'同样,要检查缓存保存功能是否已成功启用,请查找如下消息:
Writing pipeline cache contents to 'filename'自动管道缓存
当未为保存和加载操作指定文件名时,将采用自动管道缓存策略。该策略会将数据存储到系统中应用程序专用的缓存位置(QStandardPaths::CacheLocation )。
可通过以下任一方式禁用此功能:
- 设置应用程序属性Qt::AA_DisableShaderDiskCache 。(完全禁用自动存储)
- 将环境变量 QT_DISABLE_SHADER_DISK_CACHE 设置为非零值。(完全禁用自动存储)
- 将环境变量 QSG_RHI_DISABLE_SHADER_DISK_CACHE 设置为非零值。(完全禁用自动存储)
- 调用 setAutomaticPiplineCache() 时,将 enable 参数设置为 false。(完全禁用自动存储)
- 通过调用 `setPipelineCacheLoadFile()` 设置文件名。(仅禁用从自动存储中加载,转而优先使用指定的文件)
- 通过调用setPipelineCacheSaveFile() 设置文件名。(仅禁用向自动存储写入,转而优先使用指定的文件)
前两种是自 Qt 5.9 起用于控制 OpenGL 程序二进制缓存的现有机制。出于兼容性和熟悉度的考虑,Qt 6 的增强型管道缓存也支持相同的属性和环境变量。
自动管道缓存为每个应用程序使用一个文件,但每个 RHI 后端(图形 API)使用不同的文件。这意味着在应用程序下次运行时切换到另一个图形 API 不会导致丢失上次运行生成的管道缓存。 不过,对于同时显示多个QQuickWindow 实例的应用程序,可能无法100%受益于此机制,因为自动缓存每次只能存储从一个RHI对象收集的数据。(而且在默认的threaded 渲染循环中,每个窗口都有自己的RHI,因为渲染是在专用线程上独立运行的)。 若要在多窗口应用程序中充分利用磁盘缓存,建议通过setPipelineCacheSaveFile() 按窗口显式设置文件名。
另请参阅 QQuickWindow::setGraphicsConfiguration()、QQuickWindow 以及QQuickRenderControl 。
成员函数文档
QQuickGraphicsConfiguration::QQuickGraphicsConfiguration()
创建一个默认的 QQuickGraphicsConfiguration,该配置未指定任何需要场景图考虑的额外设置。
[noexcept] QQuickGraphicsConfiguration::~QQuickGraphicsConfiguration()
析构函数。
QByteArrayList QQuickGraphicsConfiguration::deviceExtensions() const
返回所请求的附加设备扩展的列表。
另请参阅 setDeviceExtensions()。
[since 6.5] bool QQuickGraphicsConfiguration::isAutomaticPipelineCacheEnabled() const
如果启用了自动管道缓存,则返回 true。
默认情况下该值为 true,除非设置了某些应用程序属性或环境变量。更多信息请参阅The Automatic Pipeline Cache 。
该函数在 Qt 6.5 中引入。
另请参阅 setAutomaticPipelineCache()。
bool QQuickGraphicsConfiguration::isDebugLayerEnabled() const
如果要启用调试/验证层,则返回 true。
默认值为 false。
另请参阅 setDebugLayer()。
bool QQuickGraphicsConfiguration::isDebugMarkersEnabled() const
如果启用了调试标记,则返回 true。
默认值为 false。
另请参阅 setDebugMarkers()。
bool QQuickGraphicsConfiguration::isDepthBufferEnabledFor2D() const
如果为 2D 内容启用了深度缓冲区,则返回 true。
默认情况下,该值为 true,除非设置了环境变量 `QSG_NO_DEPTH_BUFFER `。
QString QQuickGraphicsConfiguration::pipelineCacheLoadFile() const
返回当前用于加载管道缓存的文件名。
默认情况下,该值为空字符串。
另请参阅 setPipelineCacheLoadFile()。
QString QQuickGraphicsConfiguration::pipelineCacheSaveFile() const
返回当前用于存储管道缓存的文件名。
默认情况下,该值为空字符串。
另请参阅 setPipelineCacheSaveFile()。
[static, since 6.1] QByteArrayList QQuickGraphicsConfiguration::preferredInstanceExtensions()
返回Qt Quick 希望在VkInstance上启用的Vulkan实例扩展列表。
在大多数情况下,Qt Quick 负责创建QVulkanInstance 。此时,该函数不适用。 另一方面,当将QQuickRenderControl 与基于Vulkan的渲染结合使用时,应用程序负责创建一个QVulkanInstance ,并将其与(离屏)QQuickWindow 关联。在这种情况下,预期应用程序会查询需要启用的实例扩展列表,并在调用QVulkanInstance::create()之前将其传递给QVulkanInstance::setExtensions()。
该函数在 Qt 6.1 中引入。
bool QQuickGraphicsConfiguration::prefersSoftwareDevice() const
如果基于软件光栅化的图形设备被设为优先级,则返回 true。
默认值为 false。
另请参阅 setPreferSoftwareDevice()。
[since 6.5] void QQuickGraphicsConfiguration::setAutomaticPipelineCache(bool enable)
根据enable 调整自动管道缓存的使用方式。
除非设置了特定的应用程序属性或环境变量,否则默认值为 true。更多信息请参阅The Automatic Pipeline Cache 。
此函数自 Qt 6.5 起引入。
另请参阅 isAutomaticPipelineCacheEnabled()。
[since 6.5] void QQuickGraphicsConfiguration::setDebugLayer(bool enable)
启用图形 API 实现的调试或验证层(如有)。
实际上,Vulkan 和 Direct 3D 11 均支持此功能,前提是运行时已安装并可使用必要的支持组件(验证层、Windows SDK)。当enable 为 true 时,Qt 将尝试在 VkInstance 上启用标准验证层,或在图形设备上设置D3D11_CREATE_DEVICE_DEBUG 。
对于 macOS 上的 Metal,请在启动应用程序之前先设置环境变量METAL_DEVICE_WRAPPER_TYPE=1 。
在将enable 设置为 true 的情况下调用此函数,等同于将环境变量QSG_RHI_DEBUG_LAYER 设置为非零值。
默认值为 false。
注意:启用 调试或验证层可能会对性能产生不小的影响。强烈建议不要在启用此标志的情况下将应用程序部署到生产环境。
注意:请 注意,由于底层图形 API 设计上的差异,即使每个QQuickWindow 都有自己的QQuickGraphicsConfiguration ,此设置也并非总是可以作为QQuickWindow 的设置。特别是对于 Vulkan,实例对象 (VkInstance) 仅创建一次,然后由应用程序中的所有窗口共用。 因此,启用验证层会影响所有窗口。这也意味着,在其他窗口已经开始渲染之后才显示的窗口上尝试启用验证,在 Vulkan 中是无效的。 其他 API(如 D3D11)将调试层概念作为按设备(ID3D11Device)的设置进行暴露,因此它是真正基于窗口进行控制的(假设场景图渲染循环为每个QQuickWindow 使用专用的图形设备/上下文)。
该函数在 Qt 6.5 中引入。
另请参阅 isDebugLayerEnabled()。
[since 6.5] void QQuickGraphicsConfiguration::setDebugMarkers(bool enable)
在适用情况下,enable 负责将调试标记和对象名称插入到图形命令流中。
某些框架(例如Qt Quick 3D )能够为其创建的图形对象(缓冲区、纹理)添加名称注释,并在命令缓冲区中标记渲染通道的起始和结束位置。这些信息随后可在使用RenderDoc或 XCode 等工具生成的帧捕获中显示出来。
预计支持此功能的图形 API 包括 Vulkan(如果可用 VK_EXT_debug_utils)、Direct 3D 11 和 Metal。
将enable 设为true后调用此函数,等同于将环境变量QSG_RHI_PROFILE 设置为非零值。
默认值为 false。
注意:启用 调试标记可能会影响性能。不建议在启用该标志的情况下将应用程序发布到生产环境。
该函数在 Qt 6.5 中引入。
另请参阅 isDebugMarkersEnabled()。
void QQuickGraphicsConfiguration::setDepthBufferFor2D(bool enable)
将 2D 内容对深度缓冲区的使用设置为“enable ”。禁用后,Qt Quick 场景图将永远不会向深度缓冲区写入数据。
默认情况下,该值为 true,除非设置了环境变量QSG_NO_DEPTH_BUFFER 。
默认值 true 对绝大多数场景而言都是最优设置。禁用深度缓冲区会降低场景图批处理的效率。
但在某些情况下,允许 2D 内容写入深度缓冲区并非理想之选。假设有一个 3D 场景作为 2D 场景上的“叠加层”,通过Qt Quick 3D 渲染,并使用View3D ,其中renderMode 设置为Overlay 。在这种情况下,深度缓冲区被 2D 内容填满可能会导致意外结果。 这是因为 2D 场景图渲染器生成和处理深度值的方式,未必与 3D 场景的工作原理兼容。这可能会导致深度值冲突、碰撞以及意料之外的深度测试失败。 因此,此处的稳妥做法是将enable 设为false来调用此函数,并在QQuickWindow 中禁用2D内容的深度缓冲区写入。
注意:此 标志与设置QSG_NO_DEPTH_BUFFER 环境变量并不完全等同。该标志并不控制深度-模板缓冲区的存在与否,而是与渲染管线相关。若要强制完全禁用深度/模板附件,请将QSG_NO_DEPTH_BUFFER 和QSG_NO_STENCIL_BUFFER 设置为false。 但请注意,此类QQuickWindow 及其中的任何Item层,可能会与某些操作模式下的View3D 等项不兼容,因为3D内容需要深度缓冲区。调用此函数始终是安全的,但这可能意味着即使深度缓冲区等资源并未被实际使用,它们仍会被创建。
void QQuickGraphicsConfiguration::setDeviceExtensions(const QByteArrayList &extensions)
设置要在图形设备上启用的附加extensions 列表(例如,VkDevice )。
当使用不支持此概念的图形 API 进行渲染时,extensions 将被忽略。
注意:该 列表指定的是附加的扩展。Qt Quick 始终会启用场景图所必需的扩展。
另请参阅 deviceExtensions()。
[since 6.5] void QQuickGraphicsConfiguration::setPipelineCacheLoadFile(const QString &filename)
设置filename ,指定QQuickWindow 应从该位置加载其图形/计算管道缓存的初始内容。默认值为空,这意味着已禁用管道缓存加载。
有关管道缓存的讨论,请参阅Pipeline Cache Save and Load 。
持久化存储管道缓存可提升应用程序未来运行时的性能,因为这样可以避免耗时的着色器编译和管道构建步骤。
文件内容的加载是否发生以及何时发生并未明确规定,仅知其将在QQuickWindow 的场景图初始化过程中某个时刻发生。因此,调用此函数后,该文件必须仍然存在。QQuickGraphicsConfiguration 仅存储文件名,本身无法执行任何实际的 I/O 和图形操作。 实际操作将在稍后进行,可能在另一个线程上执行。
当使用不支持或无法获取和重新加载管道缓存(或着色器/程序二进制文件)的图形 API 时,调用此函数将没有任何效果。
调用此函数基本上等同于将环境变量QSG_RHI_PIPELINE_CACHE_LOAD 设置为filename ,但有一个重要区别:此函数仅控制与之关联的QQuickWindow 的管道缓存存储。因此,具有多个QQuickWindow 或QQuickView 实例的应用程序可以通过专用于每个窗口的文件来存储并随后重新加载缓存内容。而环境变量不允许这样做。
注意:如果 文件中的数据与运行时的图形设备和驱动程序版本不匹配,其内容将被忽略,且应用程序不会察觉。 这适用于多种图形 API,Qt 会自动处理必要的检查。但也有例外,最显著的是 Direct 3D 11,其中“管道缓存”仅用于存储运行时 HLSL 到 DXBC 编译的结果,因此与设备和供应商无关。
警告: 序列化的管道缓存数据被视为可信内容。建议应用程序开发人员切勿传入来自不可信来源的数据。
该函数在 Qt 6.5 中引入。
另请参阅 pipelineCacheLoadFile() 和setPipelineCacheSaveFile()。
[since 6.5] void QQuickGraphicsConfiguration::setPipelineCacheSaveFile(const QString &filename)
设置filename ,指定QQuickWindow 应将图形/计算管道缓存内容存储在此处。默认值为空,这意味着管道缓存加载已被禁用。
有关管道缓存的讨论,请参阅Pipeline Cache Save and Load 。
持久化存储管道缓存可在应用程序的后续运行中提升性能,因为这样可以避免耗时的着色器编译和管道构建步骤。
文件何时写入未作明确规定。这很可能发生在因关闭窗口而拆除场景图的某个时刻。因此,在QQuickWindow 完全销毁之前,应用程序不应假设该文件可用。QQuickGraphicsConfiguration 仅存储文件名,本身不会执行任何实际的 I/O 和图形操作。
当使用不支持或无法检索管道缓存(或着色器/程序二进制文件)的图形 API 时,调用此函数将无效果。
调用此函数基本上等同于将环境变量QSG_RHI_PIPELINE_CACHE_SAVE 设置为filename ,但有一个重要区别:此函数仅控制与之关联的QQuickWindow 的管道缓存存储。因此,具有多个QQuickWindow 或QQuickView 实例的应用程序可以通过专用于每个窗口的文件来存储并随后重新加载缓存内容。而环境变量不支持这种操作。
该函数于 Qt 6.5 中引入。
另请参阅 pipelineCacheLoadFile() 和pipelineCacheSaveFile()。
[since 6.5] void QQuickGraphicsConfiguration::setPreferSoftwareDevice(bool enable)
请求选择使用基于软件的栅格化技术的适配器或物理设备。仅当底层 API 支持枚举适配器(例如 Direct 3D 或 Vulkan)时才适用,否则将被忽略。
如果图形 API 实现中没有此类图形适配器或物理设备可用,则该请求将被忽略。在 Direct 3D 中,通常可以预期基于 WARP 的光栅化器始终可用。在 Vulkan 中,只有当 Mesa 的lavapipe 或某些报告VK_PHYSICAL_DEVICE_TYPE_CPU 的物理设备可用时,该标志才生效。
在将enable 设置为 true 的情况下调用此函数,等同于将环境变量QSG_RHI_PREFER_SOFTWARE_RENDERER 设置为非零值。
默认值为 false。
该函数在 Qt 6.5 中引入。
另请参阅 prefersSoftwareDevice()。
[since 6.6] void QQuickGraphicsConfiguration::setTimestamps(bool enable)
启用后,系统将从支持此功能的平台和 3D API 的命令缓冲区中收集 GPU 计时数据。该数据随后会输出到渲染器日志中——这些日志可通过环境变量 `QSG_RENDER_TIMING ` 或日志类别(如 `qt.scenegraph.time.renderloop`)启用,也可供其他模块查看,例如 `Qt Quick 3D` 中的 `DebugView ` 项。
默认情况下此功能处于禁用状态,因为收集数据可能涉及额外的工作,例如根据底层图形 API 在命令流中插入时间戳查询。要启用此功能,请将enable 设置为 true 并调用此函数,或者将QSG_RHI_PROFILE 环境变量设置为非零值。
预计支持此功能的图形 API 包括 Direct 3D 11、Direct 3D 12、Vulkan(前提是底层 Vulkan 实现支持时间戳查询)、Metal,以及版本 3.3 或更高版本且采用核心或兼容配置文件的 OpenGL。 OpenGL ES 不支持时间戳。
该函数于 Qt 6.6 中引入。
另请参阅 timestampsEnabled() 和setDebugMarkers()。
[since 6.6] bool QQuickGraphicsConfiguration::timestampsEnabled() const
如果启用了 GPU 计时数据采集,则返回 true。
默认值为 false。
该函数在 Qt 6.6 中引入。
另请参阅 setTimestamps()。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.