如何测量 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 的 sourcesourceComponent 属性更改为视觉项目实际出现在屏幕上的那一刻(被绘制)的时间?

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 项目自加载以来出现在屏幕上所用的时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 上测试不同 DPI/屏幕分辨率的 Qml/Quick UI?

如何将QML查看器自身滑入屏幕

在 QML 中截取特定项目的屏幕截图的方法是啥?

如何加载相同的 QML 文件并传递不同的属性

QML“自定义菜单”选项向上移动

android自定义控件-利用onMeasure测量使图片拉伸永不变形,解决屏幕适配问题