I’m currently observing a strange behavior on Qt-5.0.1 running on a TI AM3517 with eglfs platform.
With a very simple QML app (NumberAnimation on rotation of a 400×400 Rectangle) I obtain a render frequency (measured using the signal QQuickWindow::beforeRendering()) of 22 Hz but the rendering looks very jerky (at an estimated 10 Hz).
import QtQuick 2.0
Rectangle {
id: root
property int frameCounter: 0
property int fps: 0;
width: 800
height: 480
Rectangle {
id: image
color: "green"
width: 400; height: 400
anchors.centerIn: parent
NumberAnimation on rotation {
from: 0.0; to: 360.0
duration: 5000
loops: Animation.Infinite
}
onRotationChanged: frameCounter++
}
MouseArea {
anchors.fill: parent
onClicked: Qt.quit()
}
}
Measuring the call timing of QSGDefaultRenderer::render() method yields that every third frame takes about 100 ms whereas all others are ready after ~4 ms:
QSGDefaultRenderer::render period: 3.00449e+07 ms (first measurement invalid)
QSGDefaultRenderer::render period: 154.114 ms
QSGDefaultRenderer::render period: 6.62231 ms
QSGDefaultRenderer::render period: 5.24902 ms
QSGDefaultRenderer::render period: 4.60815 ms
QSGDefaultRenderer::render period: 103.455 ms
QSGDefaultRenderer::render period: 4.60815 ms
QSGDefaultRenderer::render period: 4.18091 ms
QSGDefaultRenderer::render period: 100.555 ms
QSGDefaultRenderer::render period: 4.57764 ms
QSGDefaultRenderer::render period: 4.24194 ms
QSGDefaultRenderer::render period: 100.586 ms
QSGDefaultRenderer::render period: 4.54712 ms
QSGDefaultRenderer::render period: 4.21142 ms
…
Well, on eglfs it is said that the threaded renderer is activated by default, so I tried QML_BAD_GUI_RENDER_LOOP=1. The good news is that the animation is running much smoother (real 43 fps), the bad is that from time to time (every ~2 sec) I still observe a render period of ~100 ms:
QSGDefaultRenderer::render period: 3.00853e+07 ms
QSGDefaultRenderer::render period: 153.351 ms
QSGDefaultRenderer::render period: 20.4163 ms
QSGDefaultRenderer::render period: 12.7869 ms
QSGDefaultRenderer::render period: 16.4795 ms
…
92 times QSGDefaultRenderer::render period: ~15.5 ms
…
QSGDefaultRenderer::render period: 15.1672 ms
QSGDefaultRenderer::render period: 105.499 ms
QSGDefaultRenderer::render period: 17.1509 ms
105 times QSGDefaultRenderer::render period: ~15.5 ms
QSGDefaultRenderer::render period: 15.3503 ms
QSGDefaultRenderer::render period: 100.342 ms
QSGDefaultRenderer::render period: 17.0593 ms
…
I tracked it further down to the glDrawElements call in QSGRenderer::draw() which is responsible for ~96 ms of the 100 ms mentioned above. This call seems to be blocked somewhere very regularly. Any hints what could be the reason? Why does the threaded renderer sometimes have a rendering period of ~4 ms? It should never be smaller than 16.66?
Flobe.
↧