performance - 单个 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
{
}
}
}
解决方案
在花了一段时间查看可能导致 QML 出现问题的性能问题后,我们终于弄清楚了导致此问题的原因。因为我们使用color
aRectangle
来为背景着色,ApplicationWindow
所以必须每 90 毫秒重新绘制Rectangle
一次。
而是使用 的color
属性为ApplicationWindow
背景着色。这么简单的错误,花了好几个小时才弄明白。
感谢那些发表评论的人。
推荐阅读
- javascript - Javascript让双重声明
- python - Numpy element-wise 通过矩阵 B 中的值对矩阵 A 的每个值取幂
- python - 从整个 DataFrame 的字符串中删除尾随 .0
- javascript - D3 可缩放的 Sunburst 和 React 通过道具更新
- c# - 如何录制两个音频输入和一个视频输入?
- google-bigquery - Big Query SQL 检查数组是否为空,否则返回 0
- spring - 数据库中的密码与使用 Spring Security 获得的密码不同
- javascript - 我如何制作一个HTML-CSS 中的标签?
- jsp - 如何使 JSP 输入复选框默认选中?
- python - 如何将列连接到表?