QML磁盘缓存

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

当使用qmake时,你可以指定CONFIG += qtquickcompiler来为添加到项目中的资源文件中的QML和JavaScript文件提供类似处理。《a href="qtquick-tools-and-utilities.html" translate="no">Qt Creator有一个设置允许将CONFIG += qtquickcompiler传递到qmake命令行。默认情况下,它在发布和配置构建中启用。由于CMake将比Qt Quick Compiler传递更多的信息,因此编译将包含更少的本地代码。

您应尽量从资源文件系统加载您的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 检视器来探索对象层次结构。QML_FORCE_DISK_CACHE 将覆盖 QML_DISABLE_DISK_CACHEQML_DISK_CACHE
QML_DISK_CACHE_PATH指定缓存文件应存储的自定义位置,而不是使用默认位置。

© 2024 Qt 公司 Ltd. 本文档中的文档贡献是各自所有者的版权。本提供的文档是根据自由软件基金会发布的《GNU 自由文档许可证》第 1.3 版的条款许可的。GNU Free Documentation License version 1.3。Qt 及其相关标志是芬兰 Qt 公司和/或其他国家的商标。所有其他商标均为各自所有者的财产。