【发布时间】:2015-06-27 11:14:55
【问题描述】:
我发现我的应用程序在多个 QQuickWindows 上调用 update() SLOT 时会消耗越来越多的 CPU 资源。
这是一个简单的测试程序:
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Window 2.2
ApplicationWindow {visible: true; width: 640; height: 480;
Window{ height: 100; width: 100; visible: true; objectName: "w1"; id:w1; }
Window{ height: 100; width: 100; visible: true; objectName: "w2"; id:w2; }
Window{ height: 100; width: 100; visible: true; objectName: "w3"; id:w3; }
Timer {
interval: 30
repeat: true
running: true
onTriggered: {
w1.update();
w2.update();
w3.update();
}
}
}
如果我用Loader 完全重新加载QQuickWindows,一切都会重置,CPU 负载会从头开始增加。
此问题已使用以下两个系统进行了测试:
Ubuntu 12.04 + Qt5.4.2 + intel_video + 开源视频驱动程序
Ubuntu14.04 + Qt5.3.2 + radeon_video + 开源视频驱动
我需要快速解决这个问题!!!我已经尝试过定期调用QQuickWindow 的releaseResources() 方法和resetOpenGLState() 方法。
另外非常有趣的是,当我在我的main.cpp 中应用putenv("LIBGL_ALWAYS_SOFTWARE=1") 时,这个问题就消失了,并且我 CONSTANT 的 cpu 使用率很低。但在我的实际应用程序中,我需要硬件渲染,所以它不是适合我的选择。
谁能测试这个问题或给我一个建议?
【问题讨论】:
-
尝试在单独的 Image 元素中实例化两个图像并使用 visible: sw 控制它们的可见性
-
我只是交换两个图像,因为它只是一个测试程序。在我的实际程序中,我正在从相机获取图像。我花了一天时间才明白这个 CPU 问题与相机无关,而是与图像绘制有关(甚至可能只是窗口内容重绘)。这对我来说非常出乎意料。
-
另外很有趣的是,当我应用 putenv("LIBGL_ALWAYS_SOFTWARE=1");在 main.cpp 这个问题消失了,我的 cpu 使用率一直很低。但在我的实际应用程序中,我需要硬件渲染,所以这不是我的选择。
标签: qt animation qml cpu qtquick2