使用Qt Quick 3D 持久缓存着色器
着色器和三维材质
使用材质渲染三维物体涉及顶点和片段着色器。
在三维场景的生命周期内首次遇到材质时,会在运行时发生以下情况:
- 生成着色器源文本。
- 着色器通过标准 Qt 着色器流水线发送。生成的结果是着色器的中间字节码版本(SPIR-V)、用于其他 3D API 的源代码变体(用于 OpenGL 的 GLSL、用于 Direct3D 的 HLSL 等)以及附加元数据。
- 当 3D 引擎创建一个graphics pipeline 时,会选择适合所用 3D API 的字节码或源代码变体,然后底层 3D API 可能会针对实际 GPU 指令集执行第二阶段编译。
所有这些操作加在一起,成本可能会很高。为了避免在应用程序的后续运行中出现这种情况,我们采用了两个基于磁盘的持久缓存。
底层缓存
Qt Quick 3D 基于Qt Quick 和场景图。在对 OpenGL 程序二进制文件、Vulkan 管道等进行基于磁盘的持久缓存时,使用的是相同的基础架构。
有关详细讨论,请参见QQuickGraphicsConfiguration#Pipeline Cache Save and Load 。
默认情况下,着色器磁盘缓存已启用。这意味着,即使平台或 3D API 实现不对已编译的着色器执行持久缓存,Qt 仍可存储 OpenGL 程序二进制文件或在QQuickWindow 生命周期中收集的类似资产。关闭窗口时会将数据写入磁盘,并在下一次运行应用程序时重新加载。这样,当着色器在以前的程序运行过程中出现时,图形管道的创建速度就会大大加快。
三维材质着色器和后处理特效也参与其中。
材质着色器缓存
与Qt Quick 不同,Qt Quick 3D 目前依赖于在运行时生成三维材质和特效的着色器源文本。使用着色器生成工具时例外,但该功能是试验性的,目前不建议在生产中使用。
生成着色器源代码文本,然后执行第一阶段编译和转译(详情请参见QtXML Shader Tools )可能是一项昂贵的操作。对于二维材质和特效,这通常在构建时进行,而对于三维材质和特效,目前还不能这样做。
因此,Qt Quick 3D 采用了另一种基于磁盘的缓存。它存储生成的 3D 材质和效果的资产。
这意味着,与底层缓存相结合,在以前的程序运行中遇到的带有材质的 3D 场景,在以后的运行中再次遇到时,将不会导致昂贵的阻塞操作。
注意: 与底层着色器和流水线缓存一样,这需要一个可写文件系统,而且平台必须通过QStandardPaths 提供一个可写缓存位置。
应用程序属性Qt::AA_DisableShaderDiskCache 和相应的环境变量也适用于材质着色器缓存。设置后,Qt 的底层和Qt Quick 3D 的材质缓存都将被禁用。
注: qml 工具默认设置此属性。通过--enable-shader-cache 命令行参数可获得与独立 Qt 应用程序相同的行为。
© 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.