单个 QML Q_PROPERTY QString 每 90 毫秒消耗高 CPU (85%)

single QML Q_PROPERTY QString consumes high CPU (85%) emitting every 90ms

我正在开发一个 QML 应用程序,它在我发出时消耗了大约 85% 的 CPU 每 90 毫秒向 QML 显示一个 QString。我们目前正在使用 Qt 5.2。我正在尝试 让我们升级到 Qt 5.9,因为此时我们不能超过 5.9.9 OS 系统.

到目前为止我唯一能够确定的是它出现是因为 我模型中的这个 QString 嵌入在 QML 的层次结构中,有一个 减速。我还从更新项目的等式中删除了 ListView 通过不在后端 C++ 端发出任何更改。相反,如果我删除 'emit my property()' 调用 QString,CPU 使用率下降到 5%。

我的意思是,如果我将 Text {} 调用移动到顶层 (main.qml) 并显示它,在所有其他条件相同的情况下,我对该应用程序的 CPU 使用来自 85% 降至 15%。

我的应用使用了 4 个浮动 windows,目前只实现了其中的 1 个。 我的模式; 属性 位于第一个 QML 'Window' 对象中。 我发现如果我将 (Window) 更改为 (Rectangle),我的 CPU 用法会下降到 大约 50%。

我还尝试在顶层定义 QString 属性 (main.qml) 和 只需在没有模型说明符的下部 'Window' 组件中使用它,本质上 改用顶级的,发现它同样慢 (85%)。我很难过 相信为 1 个 QString 更新屏幕会导致 CPU 混乱。

不幸的是,我不能 post 代码,因为它是专有的,但这是 它看起来像的基本轮廓(不是真实代码)。

我很感激任何人对这种情况的任何指示或知识。我花了一点 时间在线搜索线索,但尚未找到真正的解决方案。

谢谢!

main.qml

ApplicationWindow
{
  Rectangle
  {
     Row
     {
        FirstWindowButton {}
        SecondWindowButton {}
        ThirdWindowButton {}
        ForthWindowButton {}
     }
  }
}

FirstWindowButton.qml:

Button
{
   Loader
   {
      sourceComponent: Window
      {
          flags: Qt.Window
          FirstWindow {}
      }
   }
}

FirstWindow.qml:

Rectangle
{
   MyListView
   {
   }
}

MyListView.qml:

Rectangle
{
   Text
   {
      text: theModel.string_value <----this is the slowdown line
   }

   ScrollView
   {
      ListView 
      {
      }
   }
}

在花了一段时间查看可能导致 QML 问题的性能问题后,我们终于找出了导致此问题的原因。因为我们在使用 RectanglecolorApplicationWindow 的背景着色 必须每 90 毫秒重新绘制整个 Rectangle

改为使用 ApplicationWindowcolor 属性 为背景着色。如此简单的错误,花了很多时间才弄明白。

感谢发表评论的人。