切换图像时CPU使用率增加

乌尔达尔

我创建了一个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

我使用的三个图像可以在这里找到:

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

问题

为什么CPU使用率增加?

牛油果

快速分析表明,大多数CPU周期都花在了上itemModel.get,试图将内部模型结构转换为JavaScript对象,然后再将其返回模型即可。

整体修改模型还将涉及QtQuick Items的创建和删除,在这种情况下,这似乎不是必需的。

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

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

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

如果您确实需要保留模型修改方式,则C ++模型可能会避免昂贵的转换为JavaScript。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章