QML磁盘缓存#

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文件做类似处理。Qt Creator有一个设置,允许将 CONFIG += qtquickcompiler 传递给qmake命令行。默认情况下,它在发布和配置构建中已启用。qmake不能像CMake那样向 Qt Quick Compiler 传递那么多信息,因此编译将包含较少的本地代码。

您应尽量从资源文件系统加载您的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

加载已预先编译的编译单元,并允许对其中找到的字节码进行解释和即时编译。

aot

是代码 aot-native,aot-bytecode 的缩写。

qmlc-read

从主机文件系统中加载任何缓存的针对QML和JavaScript文件的编译单元,并允许对其中找到的字节码进行解释和即时编译。

qmlc-write

在动态编译QML或JavaScript文件时,之后创建一个缓存文件。在再次请求相同文档时,可以加载此缓存文件。

qmlc

是代码 qmlc-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_CACHE》和《QML_DISK_CACHE》。

QML_DISK_CACHE_PATH

指定缓存文件应存储的个性化位置,而不是使用默认位置。