qt - 切换图像时 CPU 使用率增加

标签 qt qml qt5 qtquick2

我创建了一个 QML 组件,它模拟无限期显示不同图像的“图像 slider ”。

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 的“计数”变量,它会按预期保持在 3。

我这样运行应用程序:qmlscene SlideImageTest.qml

Qt版本:5.3.2

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

enter image description here

enter image description here

enter image description here

问题

为什么CPU使用率会增加?

最佳答案

快速分析表明,大部分 CPU 周期都花在 itemModel.get 上,试图将内部模型结构转换为 JavaScript 对象,您可以在返回模型后立即使用该对象。

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

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

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

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

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

关于qt - 切换图像时 CPU 使用率增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26561287/

相关文章:

c++ - 使用 Qt Creator 交叉编译 Qt 应用程序的简便方法?

c - qmake 找不到一些现有的库

linux - i.MX6 上的 Yocto + Qt5(FSL 社区 BSP): xcb dependency for webkit?

macos - 如何在 OS X Mavericks 上从 git 编译 Qt 5.2

linux - 我如何使用 Qt Framework Installer 创建注册文件类型及其图标?

qt - 什么决定了 QFileDialog 中文件的排序?

qt - QML - 无法分配给不存在的属性 "style"

c++ - QT中有类似GTK Headerbars的东西吗?

javascript - 无法将 QQmlListReference 分配给 QString

android - JNI_OnLoad 返回错误版本 (-1)