为什么这个QML代码性能不佳?

时间:2014-11-16 17:34:04

标签: qml qtquick2

如果QML渲染是硬件加速的,那么这个简单的例子不应该胜过Qt classic中的等效实现吗?

import QtQuick 2.3
import QtQuick.Controls 1.2

ApplicationWindow {
    id: app
    visible: true
    width: 640
    height: 480


    Column {
        id: cc
        property real val: 0

        Row {
            spacing: 10
            TextField {
                id: numRows
                text: "1"
                property int value: parseInt(text);
                validator: IntValidator { bottom: 1; top: 100; }

            }
            TextField {
                id: numCols
                text: "1"
                property int value: parseInt(text);
                validator: IntValidator { bottom: 1; top: 100; }
            }
        }

        Repeater {
            model: numRows.value

            Row {
                Repeater {
                    model: numCols.value
                    Slider {
                        width: app.width / numCols.value
                        height: 18.5
                        value: cc.val
                        onValueChanged: cc.val = value
                    }
                }
            }
        }
    }
}

我的想法是用滑块的行和列填充屏幕,并让每个滑块连接到每个其他滑块。对于我的屏幕,我使用55行和20列。当我移动滑块时,我希望看到屏幕上所有滑块的流畅运动,但帧速率非常低(我猜5到10 fps)。我有一个非常强大的GPU,我期待更好的性能。可能有什么不对?

2 个答案:

答案 0 :(得分:1)

在(CPU,而不是QML)分析器下查看,大部分时间花在实际上是使用本机样式呈现Slider项目。如果性能是一个重要问题,而本机桌面样式不是,我建议不使用QtQuickControls 1,因为样式有很大的开销。

如果我更新您的示例以使用QtQuickControls 2,它会更加平滑:

import QtQuick 2.3
import QtQuick.Controls 2.0

ApplicationWindow {
    id: app
    visible: true
    width: 640
    height: 480


    Column {
        id: cc
        property real val: 0

        Row {
            spacing: 10
            TextField {
                id: numRows
                text: "1"
                property int value: parseInt(text);
                validator: IntValidator { bottom: 1; top: 100; }

            }
            TextField {
                id: numCols
                text: "1"
                property int value: parseInt(text);
                validator: IntValidator { bottom: 1; top: 100; }
            }
        }

        Repeater {
            model: numRows.value

            Row {
                Repeater {
                    model: numCols.value
                    Slider {
                        width: app.width / numCols.value
                        height: 18.5
                        value: cc.val
                        onPositionChanged: cc.val = position
                    }
                }
            }
        }
    }
}

答案 1 :(得分:0)

如果您自己获得1100个滑块,则需要不断更新1100个滑块。这是发送的很多信号。我不会问你需要1100同步滑块...

虽然按下滑块时只需更新cc.val就可以缩短几个周期,但这不会发生太大变化。

总而言之,您只能通过选择stepSize或设置updateValueWhileDragging: false来认真减少工作量。释放滑块时仍会看到延迟,但帧速率不会影响体验。

相关问题