如果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,我期待更好的性能。可能有什么不对?
答案 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
来认真减少工作量。释放滑块时仍会看到延迟,但帧速率不会影响体验。