如何测量 QML 项目自加载以来出现在屏幕上所用的时间?
Posted
技术标签:
【中文标题】如何测量 QML 项目自加载以来出现在屏幕上所用的时间?【英文标题】:How to measure time taken for QML item to appear on the screen since it was loaded? 【发布时间】:2018-12-16 16:21:58 【问题描述】:我如何测量从我将 QML Loader 的 source 或 sourceComponent 属性更改为视觉项目实际出现在屏幕上的那一刻(被绘制)的时间?
Loader
id: _loader
source: "MyVisualItem.qml"
我已经尝试使用 statusChanged 和 Component.onCompleted 信号,但都不够准确 - 很容易看出实际时间要长得多。
【问题讨论】:
【参考方案1】:根据the diagram in the documentation,frameSwapped()
是你最好的选择:
您需要在设置 source
/sourceComponent
之前或之后直接连接到该信号。第一次调用它时,您可以检查在屏幕上渲染它所花费的时间。之后不要忘记断开它。 :)
【讨论】:
问题在于确定哪一个是真正呈现项目的第一帧。对于 Qt Quick 2 背后的延迟渲染架构,这并不是那么简单——从技术上讲,它可能会在组件完成后发生任意帧。 我不确定是否有任何 API 可以准确了解这些信息;也许 QML 分析挂钩可用于了解渲染器何时从项目的场景图节点中收集信息,并且可能估计然后渲染的下一帧将是显示该项目的第一帧。 (换句话说,这需要了解渲染器如何在内部工作。) 还有其他类似的方式浮现在脑海中,例如一个自定义 C++ 项,构建一个设置了预处理标志的 QSGNode —— 渲染器将在其上调用QSGNode::preprocess
,因此可以再次估计下一帧将被渲染,包括该节点。【参考方案2】:
QML 分析器应该解决这个问题(例如,参见 here),
可以实现源更改和加载之间的纯时间测量 通过loader 项目本身:
Loader.Ready - the QML source has been loaded
Loader.Loading - the QML source is currently being loaded
和loaded signal:
This signal is emitted when the status becomes Loader.Ready, or on successful initial load.
The corresponding handler is onLoaded.
因此测量源更改发生和 onLoaded 调用之间的时间
【讨论】:
我尝试使用 onLoaded 信号,但结果太不准确 - 实际时间为 1200-1500 毫秒时显示为 40-60 毫秒。我当然可以使用这些数字进行比较(即查看特定更改是否会缩短过渡时间),但我更希望获得尽可能接近实时的值以上是关于如何测量 QML 项目自加载以来出现在屏幕上所用的时间?的主要内容,如果未能解决你的问题,请参考以下文章