代码之家  ›  专栏  ›  技术社区  ›  Tim

单个QML Q_属性QString每90毫秒会消耗大量CPU(85%)

  •  0
  • Tim  · 技术社区  · 6 年前

    我正在开发一个QML应用程序,当我发射信号时,它消耗了大约85%的CPU QString每隔90毫秒发送一次至QML显示屏。我们目前正在使用Qt 5.2。我正在做 让我们升级到Qt 5.9,因为现在我们不能超过5.9.9,因为一个更老的 操作系统。

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

    我的意思是,如果我将文本{}调用移动到顶层(main.qml) 在其他条件相同的情况下,我对应用程序的CPU使用量从 85%降至15%。

    我的应用程序使用了4个浮动窗口,目前只实现了其中一个。 我的模式;属性位于第一个QML“窗口”对象中。 我发现如果我把那个窗口改成一个矩形,我的CPU使用率就会下降到 大约50%。

    我还尝试在顶层(main.qml)和 只需在较低的“窗口”组件中使用它,基本上不需要模型说明符 而使用顶级的一级,发现它同样慢(85%)。我日子不好过 相信为1 QString更新屏幕会导致CPU混乱。

    不幸的是,我不能发布代码,因为它是专有的,但这里是 它看起来像什么的基本轮廓(不是真正的代码)。

    我很感激任何人对这种情况的建议或知识。我花了一点时间 时间在网上寻找线索,但还没有找到真正的解决方案。

    非常感谢。

    主要的qml

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

    第一个窗口按钮。qml:

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

    第一个窗口。qml:

    Rectangle
    {
       MyListView
       {
       }
    }
    

    MyListView。qml:

    Rectangle
    {
       Text
       {
          text: theModel.string_value <----this is the slowdown line
       }
    
       ScrollView
       {
          ListView 
          {
          }
       }
    }
    
    0 回复  |  直到 6 年前
        1
  •  0
  •   Tim    6 年前

    在花了一段时间研究可能导致QML问题的性能问题之后,我们终于找到了导致此问题的原因。因为我们用了 这个 color 一个 Rectangle 给…的背景上色 ApplicationWindow 是的 必须重新绘制整个 长方形 每隔90毫秒。

    而是使用 颜色 财产 应用程序窗口 给背景上色。这是个简单的错误,花了好几个小时才弄清楚。

    感谢那些发表评论的人。