首页 > 解决方案 > 单个 QML Q_PROPERTY QString 消耗高 CPU (85%),每 90 毫秒发射一次

问题描述

我正在开发一个 QML 应用程序,当我每 90 毫秒向 QML 显示器发出一个 QString 时,它消耗了大约 85% 的 CPU。我们目前使用的是 Qt 5.2。我正在努力让我们升级到 Qt 5.9,因为此时由于操作系统较旧,我们无法超过 5.9.9。

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

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

我的应用程序使用 4 个浮动窗口,目前只有 1 个已实现。我的模式;属性位于第一个 QML 'Window' 对象中。我发现如果我将(窗口)更改为(矩形),我的 CPU 使用率会下降到大约 50%。

我还尝试在顶层(main.qml)中定义 QString 属性,并在没有模型说明符的情况下在较低的“窗口”组件中使用它,实际上是使用顶层,但发现它同样慢(85%)。我很难相信为 1 个 QString 更新屏幕会导致 CPU 如此混乱。

不幸的是,我无法发布代码,因为它是专有的,但这里是它看起来的基本轮廓(不是真实代码)。

我感谢任何人对这种情况的任何指示或知识。我花了一些时间在网上搜索线索,但还没有找到真正的解决方案。

谢谢!

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 
      {
      }
   }
}

标签: performanceqtqmlcpu-usage

解决方案


在花了一段时间查看可能导致 QML 出现问题的性能问题后,我们终于弄清楚了导致此问题的原因。因为我们使用coloraRectangle来为背景着色,ApplicationWindow所以必须每 90 毫秒重新绘制Rectangle一次。

而是使用 的color属性为ApplicationWindow背景着色。这么简单的错误,花了好几个小时才弄明白。

感谢那些发表评论的人。


推荐阅读