切换图像时CPU使用率会增加

时间:2014-10-25 10:12:48

标签: qt qml qt5 qtquick2

我创建了一个模拟“图像滑块”的QML组件,可以无限期地显示不同的图像。

import QtQuick 2.3

Item {
    id: root

    // Start auto rotating items
    Timer {
        interval: 500; running: true; repeat: true
        onTriggered:{
            itemModel.append(itemModel.get(listView.currentIndex))
            itemModel.remove(listView.currentIndex)
        }
    }

    ListView {
        id: listView

        anchors.fill: parent

        interactive: false

        model: itemModel
        delegate:
            Image {
                id: bg
                width: listView.width
                height: listView.height
                source: bgSource

                asynchronous: true
                cache: false
            }
    }

    ListModel {
        id: itemModel
        ListElement {
            bgSource: "ui_elements/images/slideimage01.png"
        }
        ListElement {
            bgSource: "ui_elements/images/slideimage02.png"
        }
        ListElement {
            bgSource: "ui_elements/images/slideimage03.png"
        }
    }
}

不幸的是,在应用程序停止之前,CPU使用率会不断增加。如果我打印itemModel的“count”变量,它将按预期保持为3。

我按照以下方式运行应用程序:qmlscene SlideImageTest.qml

Qt版本:5.3.2

我使用的三张图片可以在这里找到:

enter image description here

enter image description here

enter image description here

问题

为什么CPU使用率会增加?

1 个答案:

答案 0 :(得分:3)

快速分析显示大多数CPU周期都花费在itemModel.get中,尝试将内部模型结构转换为JavaScript对象,然后再移回模型。

整体修改模型也将涉及在这种情况下似乎不需要的QtQuick项目创建和删除。

解决此问题的更有效方法是让ListView滚动到下一个图像,而不是在ListView中当前突出显示的位置更改模型:

Timer {
    onTriggered:{
        listView.incrementCurrentIndex()
    }
}

ListView {
    id: listView
    keyNavigationWraps: true
    highlightMoveDuration: 0
    ...
}

如果您真的需要保持模型修改方式,C++ model可能会避免代价高昂的JavaScript转换。