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_CACHE和QML_DISK_CACHE。
QML_DISK_CACHE_PATH指定缓存文件应存储的自定义位置,而不是使用默认位置。