Make hellogl work properly regardless of vsync

Task-number: QTBUG-39370
Change-Id: I5b7acb8367f18bfa9318c292657ff7fa0f21f664
Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com>
This commit is contained in:
Laszlo Agocs 2014-07-28 20:18:35 +02:00
parent b48febd568
commit 770f914083
2 changed files with 21 additions and 7 deletions
examples/opengl

View File

@ -109,10 +109,24 @@
\snippet hellogl/glwidget.cpp 5
In the above slot, the \c xRot variable is updated only if the new angle
is different to the old one, the \c xRotationChanged() signal is emitted to
allow other components to be updated, and the widget's
\l{QGLWidget::updateGL()}{updateGL()} handler function is called.
In the above slot, the \c xRot variable is updated only if the new angle is
different to the old one, the \c xRotationChanged() signal is emitted to
allow other components to be updated, and an update is scheduled.
Note that the widget's \l{QGLWidget::updateGL()}{updateGL()} function is not
called directly from here. Triggering rendering and buffer swaps directly
from the input event handlers is not desirable. Such events may, depending
on the platform, occur at a high frequency, and calling a potentially
blocking function like \l{QOpenGLContext::swapBuffers()}{swapBuffers} may
lead to unexpected results due to the main thread not being able to process
the input events at a proper rate.
Instead, update() is used. This will eventually lead to a paint event, which
will in turn invoke paintGL(). Multiple calls to update() in a row will make
no difference while the event is still pending. This way the UI will perform
equally well with blocking swaps, that is, a a
\l{QGLFormat::swapInterval()}{swap interval} of 1, and non-vsynced
configurations.
The \c setYRotation() and \c setZRotation() slots perform the same task for
rotations measured by the \c yRot and \c zRot variables.

View File

@ -100,7 +100,7 @@ void GLWidget::setXRotation(int angle)
if (angle != xRot) {
xRot = angle;
emit xRotationChanged(angle);
updateGL();
update();
}
}
//! [5]
@ -111,7 +111,7 @@ void GLWidget::setYRotation(int angle)
if (angle != yRot) {
yRot = angle;
emit yRotationChanged(angle);
updateGL();
update();
}
}
@ -121,7 +121,7 @@ void GLWidget::setZRotation(int angle)
if (angle != zRot) {
zRot = angle;
emit zRotationChanged(angle);
updateGL();
update();
}
}