首页 文章

在QML中丢帧时绑定不更新

提问于
浏览
0

我有一个UI元素,在我进行计算时出现,并在计算完成时消失 . 出现和消失是动画的 . 动画将项目的 implicitHeight0 设置为 X ,反之亦然 . 这些物品作为代表居住在 ListView 中 . ListView 作为此组件的根元素包装在 Item 中 . 此根元素的 implicitHeight 依赖于,也就是绑定到 ListViewcontentHeight . 此根元素的宽度设置在使用组件的位置 . 在这里,您可以在代码中看到我的解释:

Item {
    id: _root

    implicitHeight: _listView.contentHeight

    ListView {
        id: _listView

        width: _root.width
        height: contentHeight

        delegates: AnimatingItem {
            // ...
        }
    }
}

代码中的 AnimatingItem 已预定义 height (对于所有人来说不一定相同) . 我写了一个小的调试代码片,它基本上按下按钮将 ListViewcontentHeightchildrenRect.heightheight 和根项目的 implicitHeight 写入控制台 .

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

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

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

1 回答

  • 3

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

    根据经验,你应该在main / gui线程中进行大量计算 . 如果它导致GUI冻结超过10毫秒,则需要将其卸载到专用线程,并异步更新结果 . 不要失速或阻止gui线程!

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

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

相关问题