在QML中丢帧时绑定不更新

时间:2017-08-31 09:59:37

标签: qt binding qml

我有一个UI元素,在我进行计算时出现,并在计算结束时消失。出现和消失是动画的。动画将项目的implicitHeight0设置为X,反之亦然。这些项目作为代表居住在ListViewListView包含在Item中作为此组件的根元素。此根元素的implicitHeight取决于,也就是绑定到contentHeight的{​​{1}}。此根元素的宽度设置在使用组件的位置。在这里,您可以在代码中看到我的解释:

ListView

代码中的Item { id: _root implicitHeight: _listView.contentHeight ListView { id: _listView width: _root.width height: contentHeight delegates: AnimatingItem { // ... } } } 已预定义AnimatingItem(对所有人来说不一定相同)。我写了一个小的调试代码段,基本上将height的{​​{1}},ListViewcontentHeight和根项childrenRect.height写入控制台上的按钮按

在大多数情况下,当我按下此按钮打印出这些值时,例如在项目存在时的计算期间(= height),或者当没有计算时,项目被隐藏(= {{ 1}}),他们都匹配。

在某些情况下,当我做一些非常繁重的计算时,即使UI冻结/丢弃帧并且计算结束,我按下调试按钮,所有implicitHeight的值都匹配(= {{1} }),但项目的X不同(= 0)。奇怪的是,ListView或换句话说0消失,因此没有可见的项目,但如果我将implicitHeight锚定到此项目的顶部,那么它将当X消失时,漂浮在空中而不是向下移动。

如果我有一个非常繁重的计算,是否有可能一个或多个绑定因为丢帧而“忘记”更新?

1 个答案:

答案 0 :(得分:3)

在某些平台上,动画不会在专用线程中运行,但我不认为是Mac OS的情况。因此,由于缺乏图形性能而丢弃帧不应导致绑定评估中的跳过。现在,如果你有一个CPU热点作为丢帧的原因,那就是另一回事了。动画会同步到事件循环速率以及场景图形速率,因此如果您的事件循环停止,那么它根本就不会使值更改,这就是您没有获得重新评估的原因。

根据经验,你强调永远在main / gui线程中进行繁重的计算。如果它导致GUI冻结超过10毫秒,则需要将其卸载到专用线程,并异步更新结果。 不要拖延或阻止gui线程!

此外,在许多情况下,绑定到contentHeight对我来说没有预期效果。已证明有效的是绑定contentItem.childrenRect.height。此外,如果根项目只是一个空项目,则完全是多余的,但即使它有直接子项目,也可以使用列表视图(也是Item)来完成。

如果您将视图缩放到完整高度,我建议您使用Column代替Repeater。一个简单的中继器将利用所有的模型功能和效率,所以不用担心。