From 1a5c3af0f3e75a518c27c6bdd3f58896a49b167e Mon Sep 17 00:00:00 2001 From: Benjamin Poulain Date: Mon, 15 Feb 2010 14:35:50 +0100 Subject: Update the composition demo at 60 FPS instead of at painting rate The Composition demo was updating as fast as the possible (update was called in the paint event). This is very CPU intensive, making the demo look slow on slower computer. The update is now made with a 16ms interval. Reviewed-by: Gabriel de Dietrich --- demos/composition/composition.cpp | 35 ++++++++++++++++++++++++++++++----- demos/composition/composition.h | 13 ++++++++----- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/demos/composition/composition.cpp b/demos/composition/composition.cpp index e03f3e6..deca5dc 100644 --- a/demos/composition/composition.cpp +++ b/demos/composition/composition.cpp @@ -48,6 +48,8 @@ #include #include +const int animationInterval = 15; // update every 16 ms = ~60FPS + CompositionWidget::CompositionWidget(QWidget *parent) : QWidget(parent) { @@ -236,6 +238,7 @@ CompositionRenderer::CompositionRenderer(QWidget *parent) : ArthurFrame(parent) { m_animation_enabled = true; + m_animationTimer = startTimer(animationInterval); #ifdef Q_WS_QWS m_image = QPixmap(":res/composition/flower.jpg"); m_image.setAlphaChannel(QPixmap(":res/composition/flower_alpha.jpg")); @@ -264,6 +267,20 @@ QRectF rectangle_around(const QPointF &p, const QSizeF &size = QSize(250, 200)) return rect; } +void CompositionRenderer::setAnimationEnabled(bool enabled) +{ + if (m_animation_enabled == enabled) + return; + m_animation_enabled = enabled; + if (enabled) { + Q_ASSERT(!m_animationTimer); + m_animationTimer = startTimer(animationInterval); + } else { + killTimer(m_animationTimer); + m_animationTimer = 0; + } +} + void CompositionRenderer::updateCirclePos() { if (m_current_object != NoObject) @@ -471,10 +488,6 @@ void CompositionRenderer::paint(QPainter *painter) painter->drawImage(0, 0, m_buffer); #endif } - - if (m_animation_enabled && m_current_object == NoObject) { - updateCirclePos(); - } } void CompositionRenderer::mousePressEvent(QMouseEvent *e) @@ -489,6 +502,10 @@ void CompositionRenderer::mousePressEvent(QMouseEvent *e) } else { m_current_object = NoObject; } + if (m_animation_enabled) { + killTimer(m_animationTimer); + m_animationTimer = 0; + } } void CompositionRenderer::mouseMoveEvent(QMouseEvent *e) @@ -500,7 +517,15 @@ void CompositionRenderer::mouseReleaseEvent(QMouseEvent *) { m_current_object = NoObject; - if (m_animation_enabled) + if (m_animation_enabled) { + Q_ASSERT(!m_animationTimer); + m_animationTimer = startTimer(animationInterval); + } +} + +void CompositionRenderer::timerEvent(QTimerEvent *event) +{ + if (event->timerId() == m_animationTimer) updateCirclePos(); } diff --git a/demos/composition/composition.h b/demos/composition/composition.h index 1123531..f5a9fc3 100644 --- a/demos/composition/composition.h +++ b/demos/composition/composition.h @@ -109,10 +109,6 @@ public: void paint(QPainter *); - void mousePressEvent(QMouseEvent *); - void mouseMoveEvent(QMouseEvent *); - void mouseReleaseEvent(QMouseEvent *); - void setCirclePos(const QPointF &pos); QSize sizeHint() const { return QSize(500, 400); } @@ -121,6 +117,12 @@ public: int circleColor() const { return m_circle_hue; } int circleAlpha() const { return m_circle_alpha; } +protected: + void mousePressEvent(QMouseEvent *); + void mouseMoveEvent(QMouseEvent *); + void mouseReleaseEvent(QMouseEvent *); + void timerEvent(QTimerEvent *); + public slots: void setClearMode() { m_composition_mode = QPainter::CompositionMode_Clear; update(); } void setSourceMode() { m_composition_mode = QPainter::CompositionMode_Source; update(); } @@ -150,7 +152,7 @@ public slots: void setCircleAlpha(int alpha) { m_circle_alpha = alpha; update(); } void setCircleColor(int hue) { m_circle_hue = hue; update(); } - void setAnimationEnabled(bool enabled) { m_animation_enabled = enabled; update(); } + void setAnimationEnabled(bool enabled); private: void updateCirclePos(); @@ -177,6 +179,7 @@ private: ObjectType m_current_object; bool m_animation_enabled; + int m_animationTimer; #ifdef QT_OPENGL_SUPPORT QGLPixelBuffer *m_pbuffer; -- cgit v0.12