QML 磁盘缓存

您应使用qt_add_qml_module定义 QML 模块,以确保Qt Quick Compiler能提前处理 QML 和 JavaScript 文件。此外,它还能保证运行时的最佳性能。Qt Quick 编译器会为每个函数和绑定生成字节码。QML 解释器和 QML 引擎中的即时 (JIT) 编译器可使用这些字节码。此外,Qt Quick 编译器还会为合适的函数和绑定生成本地代码。本地代码可直接执行,因此比解释或即时编译字节代码的性能更好。然后,字节代码和本地代码都会被编译到你的二进制文件中。

使用qmake时,您可以指定CONFIG += qtquickcompiler 对作为资源添加到项目中的 QML 和 JavaScript 文件进行类似处理。 Qt Creatorqmake 有一个允许向 qmake 命令行传递CONFIG += qtquickcompiler 的设置。qmake无法像 CMake 那样向Qt Quick 编译器传递那么多信息。因此,编译时包含的本地代码会较少。

应确保尽可能从资源文件系统加载 QML 文档。否则 QML 引擎将无法找到提前编译好的代码。

如果在运行时找不到 QML 文档的字节码或本地代码,或找到了代码但无法使用,QML 引擎就会把文档编译成字节码。编译过程可能很耗时,而且编译结果只包含字节码。同一文档的后续加载将产生相同的字节码。QML 引擎可通过缓存编译结果来优化这一步骤。它把字节码存储在缓存文件中,以后再请求相同的 QML 文档时,就会加载缓存文件,而不是重新编译。通常,缓存文件存储在系统缓存目录的子目录qmlcache 中,如QStandardPaths::CacheLocation 所示。

我们会进行检查,确保只有在满足以下所有条件时,才会加载任何缓存文件和任何提前编译的代码:

  • Qt 版本未变
  • 原始文件中的源代码未变
  • QML 调试器未运行

只有QML_FORCE_DISK_CACHE 变量(见下文)只覆盖有关 QML 调试器的条件。其他环境变量不会影响这些条件。

微调提前编译代码和缓存行为的主要方法是通过环境变量QML_DISK_CACHE 。例如,该变量使用逗号分隔的选项列表:

QML_DISK_CACHE=aot,qmlc-read

可用选项如下:

选项说明
aot-native加载提前编译的编译单元,并允许执行其中的任何本地代码。
aot-bytecode加载提前编译的编译单元,并允许解释和即时编译其中的字节码。
aotaot-native,aot-bytecode 的缩写。
qmlc-read从主机文件系统加载 QML 和 JavaScript 文件的任何缓存编译单元,并允许解释和及时编译其中的字节码。
qmlc-write即时编译 QML 或 JavaScript 文件时,可在编译后创建缓存文件。缓存文件可在再次请求相同文件时加载。
qmlcqmlc-read,qmlc-write 的缩写。

此外,你还可以使用以下环境变量:

环境变量环境变量
QML_DISABLE_DISK_CACHE禁用磁盘缓存并强制从源代码重新编译所有 QML 和 JavaScript 文件。QML_DISABLE_DISK_CACHE 覆盖QML_DISK_CACHE
QML_FORCE_DISK_CACHE即使在调试 QML 时也启用磁盘缓存。您不能以这种方式使用 JavaScript 调试器。例如,它可能无法在断点处停止。QML_FORCE_DISK_CACHE 覆盖QML_DISABLE_DISK_CACHEQML_DISK_CACHE
QML_DISK_CACHE_PATH指定存储缓存文件的自定义位置,而不是使用默认位置。

© 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.