Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个QML代码的性能很差?_Qml_Qtquick2 - Fatal编程技术网

为什么这个QML代码的性能很差?

为什么这个QML代码的性能很差?,qml,qtquick2,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 {

如果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,我期待更好的性能。有什么问题吗?

如果你有1100个滑块,你要求不断更新1100个滑块。这是许多信号被发送。我不会问你需要1100个同步滑块做什么

尽管当按下滑块时,只需更新
cc.val
就可以逐步缩短几个周期,但这不会有太大变化

总而言之,只有通过选择
步长
或设置
updateValueWhileDragging:false
,才能大大减少所做的工作。释放滑块时仍会看到延迟,但帧速率不会对体验造成太大的干扰。

在(CPU,而不是QML)探查器下查看这一点,实际花费的大部分时间是使用本机样式渲染
滑块
项。如果性能是一个重要的问题,而本机桌面样式不是,我建议不要使用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
                    }
                }
            }
        }
    }
}

您使用的是OpenGL还是ANGLE版本?@ddriver我很确定这是OpenGL版本。这两者在性能上有很大区别吗?一个信号的成本与大约10个函数调用的成本相同,所以我认为这不是问题。显然,我不需要1100个滑块,但我正在尝试比较渲染性能。考虑到Qt Quick具有硬件加速功能,我希望看到此QML代码以高帧速率运行。您应该运行代码并将QML探查器连接到进程。(在QtCreator中,单击“分析”并点击QML Profiler视图中的“开始”按钮),它将显示处理一个鼠标事件需要花费大量时间。对我来说,大约需要23到27毫秒。在最坏的情况下,你移动鼠标的每一个像素都会执行代码。因为该代码是从事件循环内部运行的,所以只要您在该函数中,就无法处理下一个鼠标事件,但它们将排队。在这种情况下,综合渲染的影响最小。试着为你的基准找到另一种方法