QQuickGraphicsConfiguration Class
QQuickGraphicsConfiguration 可控制QQuickWindow 的低级图形设置...更多...
Header: | #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 实例 (VkInstance
)、物理设备 (VkPhysicalDevice
)、设备 (VkDevice
) 和相关对象(队列、池)都是通过 Vulkan API 初始化的。在使用QQuickRenderControl 将渲染重定向到自定义渲染目标(如纹理)时,情况也是如此。虽然QVulkanInstance 的构建由应用程序控制,但其他图形对象的初始化在QQuickRenderControl::initialize() 中进行,与屏幕上的QQuickWindow 相同。
对于大多数应用程序来说,无需额外配置,因为Qt Quick 为许多底层图形设置提供了合理的默认值,例如启用哪些设备扩展。
但这并不总是足够的。在高级用例中,当集成直接的 Vulkan 或其他图形 API 内容时,或者当集成外部 3D 或 VR 引擎(如 OpenXR)时,应用程序会希望在涉及到细节(如启用哪些设备扩展)时指定自己的设置集。
这正是该类所能实现的。例如,它允许指定一个设备扩展名列表,然后在使用 Vulkan 或图形应用程序接口时,由场景图获取这些扩展名。在某些概念不适用的情况下,相关设置会被直接忽略。
这类函数的例子有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() 函数在指定启用 Vulkan 验证或 Direct3D 调试层的同时打开了QQuickView :
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 有不同的概念。这里的高级流水线缓存概念将所有这些抽象为将单个二进制 Blob 存入文件或从文件中检索单个二进制 Blob。
注意: 将缓存存储在磁盘上可以在应用程序的后续运行中带来改进,有时甚至是显著的改进。
当遇到与前一次运行相同的着色器程序和/或流水线状态时,可能会跳过许多操作,从而加快着色器和材质初始化时间,这意味着启动速度可能会加快,渲染过程中的延迟和 "卡顿 "现象可能会减少或避免。
当使用不适用或不支持检索和重新加载管道缓存(或着色器/程序二进制文件)的 Graphical 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 和 OpenGL 时,该机制也始终处于激活状态。不过,当使用这里提供的新的、独立于图形 API 的管道缓存抽象时,Qt 5 时代的程序二进制缓存会自动禁用,因为现在相同的内容都打包在 "管道缓存 "中。
- Direct 3D 11 - 在第二阶段编译(将独立于供应商的中间字节码编译成设备特定指令集)中,没有流水线或检索二进制文件的本地概念。在这一层面,驱动程序通常会采用自己的缓存系统。相反,Qt Quick "流水线缓存 "可用于加快着色器包含 HLSL 源代码的情况,这些源代码需要首先编译成中间字节码格式。这可以显著提高在运行时编译着色器代码的应用程序和库的性能,因为在后续运行中,如果遇到的 HLSL 着色器的字节码已经可用,就可以避免对D3DCompile() 的潜在昂贵、未缓存的调用。Qt Quick 3D 就是一个很好的例子,运行时生成的材质着色器意味着必须处理 HLSL 源代码。因此,保存并重新加载Qt Quick 管道缓存可以大大改善包含一个或多个View3D 项目的场景。Qt Quick 本身就是一个反例:由于大多数用于 2D 内容的内置着色器都是在构建时生成的 DirectX 字节码,因此缓存不会带来任何显著的改进。
所有这些都与QtXML Shader Tools 模块及其命令行工具(如 qsb
)执行的 Shader 处理无关。以 Vulkan 为例。在离线或构建时(直接通过 qsb 或 CMake)将兼容 Vulkan 的 GLSL 源代码编译到 SPIR-V 是件好事,因为在运行时可以避免从源代码形式进行昂贵的编译。不过,SPIR-V 是一种独立于供应商的中间格式。在运行时,当构建图形或计算流水线时,很可能会发生另一轮编译,这一次是从中间格式编译到 GPU 的厂商特定指令集(这可能还取决于图形流水线和渲染目标的某些状态)。流水线缓存有助于后一阶段的工作。
注: 许多图形应用程序接口实施都采用了自己的持久磁盘缓存,对应用程序透明。在这种情况下,使用Qt Quick 的管道缓存功能可能会有所改进,但收益可能较小。
调用setPipelineCacheSaveFile() 和setPipelineCacheLoadFile() 可以控制QQuickWindow 或QQuickView 保存和加载管道缓存的文件。
要了解启用磁盘存储管道缓存的效果,可通过环境变量QSG_INFO=1
或qt.scenegraph.general
和qt.rhi.general
日志类别启用最重要的场景图和 Graphical Effects 日志。关闭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() 并将启用参数设置为 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。
默认值为假。
另请参见 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 XML 会尝试在 VkInstance 上启用标准验证层,或在图形设备上设置D3D11_CREATE_DEVICE_DEBUG
。
对于 macOS 上的 Metal,请在启动应用程序前设置环境变量METAL_DEVICE_WRAPPER_TYPE=1
。
在enable 设置为 true 时调用此函数,相当于将环境变量QSG_RHI_DEBUG_LAYER
设置为非零值。
默认值为 false。
注意: 启用调试层或验证层可能会对性能产生非显著影响。强烈建议在将应用程序交付生产时启用该标志。
注意: 请注意,由于底层图形 API 的设计不同,该设置不可能始终是每个QQuickWindow 的设置,尽管每个QQuickWindow 都有自己的QQuickGraphicsConfiguration 。尤其是 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 等工具制作的帧捕获中,这些注释都是可见的。
Vulkan(如果 VK_EXT_debug_utils 可用)、Direct 3D 11 和 Metal 等图形应用程序接口有望支持此功能。
在enable 设置为 true 时调用此函数,相当于将环境变量QSG_RHI_PROFILE
设置为非零值。
默认值为 false。
注意: 启用调试标记可能会影响性能。不建议在启用该标记的情况下将应用程序交付生产。
此函数在 Qt 6.5 中引入。
另请参阅 isDebugMarkersEnabled()。
void QQuickGraphicsConfiguration::setDepthBufferFor2D(bool enable)
将enable 设置为 2D 内容使用深度缓冲区。禁用时,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
。但要注意的是,这样的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 和图形操作。真正的工作将在稍后进行,可能是在另一个线程上。
当运行的图形应用程序接口不适用或不支持检索和重新加载管道缓存(或着色器/程序二进制文件)时,调用此函数没有任何作用。
调用此函数在很大程度上等同于将环境变量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 和图形操作。
当运行的图形应用程序接口不适用或不支持检索管道缓存(或着色器/程序二进制文件)时,调用此函数没有任何作用。
调用此函数在很大程度上等同于将环境变量QSG_RHI_PIPELINE_CACHE_SAVE
设置为filename ,但有一个重要区别:此函数仅控制相关QQuickWindow 的管道缓存存储。因此,具有多个QQuickWindow 或QQuickView 实例的应用程序可以通过每个窗口专用的文件来存储和重新加载缓存内容。环境变量不允许这样做。
此功能在 Qt 6.5 中引入。
另请参阅 pipelineCacheSaveFile(),pipelineCacheLoadFile() 和 setPipelineCacheSaveFile()。
[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)
启用后,GPU 时序数据将从支持此功能的平台和 3D API 的命令缓冲区中收集。这些数据会打印在渲染器日志中,可通过QSG_RENDER_TIMING
环境变量或日志类别(如qt.scenegraph.time.renderloop
)启用,其他模块(如Qt Quick 3D 的DebugView 项目)也可看到这些数据。
默认情况下禁用此功能,因为收集数据可能涉及额外工作,例如在命令流中插入时间戳查询,这取决于底层图形 API。要启用此功能,要么调用enable 并将其设置为 true,要么将QSG_RHI_PROFILE
环境变量设置为非零值。
预计支持时间戳查询的图形应用程序接口包括 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()。
© 2025 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.