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引擎可以通过缓存编译结果来优化此步骤。它将字节码存储在缓存文件中,并在再次请求相同的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_CACHEQML_DISK_CACHE

QML_DISK_CACHE_PATH

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