From 1b5d9a30adc0c9ca4f7929c375db008830586516 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 3 Apr 2014 15:05:27 +0300 Subject: Introduce fps measurement via properties MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTRD-2134 Change-Id: I181ee6c784b998886c2292b7548e16ce75d86458 Reviewed-by: Tomi Korpipää --- src/datavisualization/axis/qvalue3daxis.cpp | 10 ++++++ src/datavisualization/data/qabstract3dseries.cpp | 4 +++ ...tdatavisualization-qml-abstractdeclarative.qdoc | 20 +++++++++++ .../engine/abstract3dcontroller.cpp | 39 ++++++++++++++++---- .../engine/abstract3dcontroller_p.h | 12 +++++++ .../engine/abstract3drenderer.cpp | 29 --------------- .../engine/abstract3drenderer_p.h | 11 ------ src/datavisualization/engine/qabstract3dgraph.cpp | 41 +++++++++++++++++++++- src/datavisualization/engine/qabstract3dgraph.h | 9 ++++- 9 files changed, 127 insertions(+), 48 deletions(-) (limited to 'src/datavisualization') diff --git a/src/datavisualization/axis/qvalue3daxis.cpp b/src/datavisualization/axis/qvalue3daxis.cpp index 3a8b902f..79d374ea 100644 --- a/src/datavisualization/axis/qvalue3daxis.cpp +++ b/src/datavisualization/axis/qvalue3daxis.cpp @@ -73,6 +73,15 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION * \c {d, i, o, x, X, f, F, e, E, g, G, c}. See QString::sprintf() for additional details. */ +/*! + * \qmlproperty ValueAxis3DFormatter ValueAxis3D::formatter + * \since QtDataVisualization 1.1 + * + * Defines the axis \a formatter to be used. Any existing formatter is deleted when a new formatter + * is set. + * + */ + /*! * Constructs QValue3DAxis with the given \a parent. */ @@ -170,6 +179,7 @@ QString QValue3DAxis::labelFormat() const /*! * \property QValue3DAxis::formatter + * \since Qt Data Visualization 1.1 * * Defines the axis \a formatter to be used. Any existing formatter is deleted when a new formatter * is set. diff --git a/src/datavisualization/data/qabstract3dseries.cpp b/src/datavisualization/data/qabstract3dseries.cpp index 934fad16..827f2e7f 100644 --- a/src/datavisualization/data/qabstract3dseries.cpp +++ b/src/datavisualization/data/qabstract3dseries.cpp @@ -242,6 +242,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION /*! * \qmlproperty string Abstract3DSeries::itemLabel + * \since QtDataVisualization 1.1 * * Contains the formatted item label. If there is no selected item or the selected item is not * visible, returns an empty string. @@ -251,6 +252,7 @@ QT_BEGIN_NAMESPACE_DATAVISUALIZATION /*! * \qmlproperty bool Abstract3DSeries::itemLabelVisible + * \since QtDataVisualization 1.1 * * If \c true, item labels are drawn as floating labels in the graph. Otherwise item labels are not * drawn. If you prefer to show the item label in an external control, set this property to @@ -608,6 +610,7 @@ QString QAbstract3DSeries::name() const /*! * \property QAbstract3DSeries::itemLabel + * \since Qt Data Visualization 1.1 * * Contains the formatted item label. If there is no selected item or the selected item is not * visible, returns an empty string. @@ -621,6 +624,7 @@ QString QAbstract3DSeries::itemLabel() const /*! * \property QAbstract3DSeries::itemLabelVisible + * \since Qt Data Visualization 1.1 * * If \c true, item labels are drawn as floating labels in the graph. Otherwise item labels are not * drawn. If you prefer to show the item label in an external control, set this property to diff --git a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc index 891cc5c1..e6e3e881 100644 --- a/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc +++ b/src/datavisualization/doc/src/qtdatavisualization-qml-abstractdeclarative.qdoc @@ -124,6 +124,26 @@ \sa renderingMode */ +/*! + * \qmlproperty bool AbstractGraph3D::measureFps + * \since QtDataVisualization 1.1 + * + * If \c true, the rendering is done continuously instead of on demand, and currentFps property + * is updated. Defaults to false. + * + * \sa currentFps + */ + +/*! + * \qmlproperty int AbstractGraph3D::currentFps + * \since QtDataVisualization 1.1 + * + * When fps measuring is enabled, the results for the last second are stored in this read-only + * property. It takes at least a second before this value updates after measurement is activated. + * + * \sa measureFps + */ + /*! * \qmlmethod void AbstractGraph3D::clearSelection() * Clears selection from all attached series. diff --git a/src/datavisualization/engine/abstract3dcontroller.cpp b/src/datavisualization/engine/abstract3dcontroller.cpp index a6081960..9283ccb4 100644 --- a/src/datavisualization/engine/abstract3dcontroller.cpp +++ b/src/datavisualization/engine/abstract3dcontroller.cpp @@ -52,7 +52,10 @@ Abstract3DController::Abstract3DController(QRect initialViewport, Q3DScene *scen m_isDataDirty(true), m_isSeriesVisibilityDirty(true), m_isSeriesVisualsDirty(true), - m_renderPending(false) + m_renderPending(false), + m_measureFps(false), + m_numFrames(0), + m_currentFps(0.0) { if (!m_scene) m_scene = new Q3DScene; @@ -373,12 +376,21 @@ void Abstract3DController::render(const GLuint defaultFboHandle) if (!m_renderer) return; - m_renderer->render(defaultFboHandle); + if (m_measureFps) { + // Measure speed (as milliseconds per frame) + m_numFrames++; + int elapsed = m_frameTimer.elapsed(); + if (elapsed >= 1000) { + m_currentFps = qreal(m_numFrames) * 1000.0 / qreal(elapsed); + emit currentFpsChanged(m_currentFps); + m_numFrames = 0; + m_frameTimer.restart(); + } + // To get meaningful framerate, don't just do render on demand. + emitNeedRender(); + } -#ifdef DISPLAY_RENDER_SPEED - // To get meaningful framerate, don't just do render on demand. - emitNeedRender(); -#endif + m_renderer->render(defaultFboHandle); } void Abstract3DController::mouseDoubleClickEvent(QMouseEvent *event) @@ -952,6 +964,21 @@ void Abstract3DController::handleRequestShadowQuality(QAbstract3DGraph::ShadowQu setShadowQuality(quality); } +void Abstract3DController::setMeasureFps(bool enable) +{ + if (m_measureFps != enable) { + m_measureFps = enable; + m_currentFps = 0.0; + + if (enable) { + m_frameTimer.start(); + m_numFrames = -1; + emitNeedRender(); + } + emit measureFpsChanged(enable); + } +} + void Abstract3DController::handleAxisLabelFormatChangedBySender(QObject *sender) { // Label format changing needs to dirty the data so that labels are reset. diff --git a/src/datavisualization/engine/abstract3dcontroller_p.h b/src/datavisualization/engine/abstract3dcontroller_p.h index aa05fc9f..f18ed452 100644 --- a/src/datavisualization/engine/abstract3dcontroller_p.h +++ b/src/datavisualization/engine/abstract3dcontroller_p.h @@ -36,6 +36,7 @@ #include "qabstractdataproxy.h" #include "q3dscene_p.h" #include +#include class QFont; class QOpenGLFramebufferObject; @@ -160,6 +161,11 @@ protected: QList m_seriesList; + bool m_measureFps; + QTime m_frameTimer; + int m_numFrames; + qreal m_currentFps; + explicit Abstract3DController(QRect initialViewport, Q3DScene *scene, QObject *parent = 0); public: @@ -269,6 +275,10 @@ public slots: // Renderer callback handlers void handleRequestShadowQuality(QAbstract3DGraph::ShadowQuality quality); + void setMeasureFps(bool enable); + inline bool measureFps() const { return m_measureFps; } + inline qreal currentFps() const { return m_currentFps; } + signals: void shadowQualityChanged(QAbstract3DGraph::ShadowQuality quality); void activeInputHandlerChanged(QAbstract3DInputHandler *inputHandler); @@ -279,6 +289,8 @@ signals: void axisYChanged(QAbstract3DAxis *axis); void axisZChanged(QAbstract3DAxis *axis); void elementSelected(QAbstract3DGraph::ElementType type); + void measureFpsChanged(bool enabled); + void currentFpsChanged(qreal fps); protected: virtual QAbstract3DAxis *createDefaultAxis(QAbstract3DAxis::AxisOrientation orientation); diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index 38e81be6..0b8ac8d1 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -48,10 +48,6 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_clickedSeries(0), m_clickedType(QAbstract3DGraph::ElementNone), m_selectionLabelItem(0) -#ifdef DISPLAY_RENDER_SPEED - , m_isFirstFrame(true), - m_numFrames(0) -#endif { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); @@ -97,23 +93,6 @@ void Abstract3DRenderer::initializeOpenGL() void Abstract3DRenderer::render(const GLuint defaultFboHandle) { -#ifdef DISPLAY_RENDER_SPEED - // For speed computation - if (m_isFirstFrame) { - m_lastFrameTime.start(); - m_isFirstFrame = false; - } - - // Measure speed (as milliseconds per frame) - m_numFrames++; - if (m_lastFrameTime.elapsed() >= 1000) { // print only if last measurement was more than 1s ago - qDebug() << float(m_lastFrameTime.elapsed()) / float(m_numFrames) << "ms/frame (=" - << float(m_numFrames) << "fps)"; - m_numFrames = 0; - m_lastFrameTime.restart(); - } -#endif - if (defaultFboHandle) { glDepthMask(true); glEnable(GL_DEPTH_TEST); @@ -139,14 +118,6 @@ void Abstract3DRenderer::render(const GLuint defaultFboHandle) glDisable(GL_SCISSOR_TEST); } -//QString Abstract3DRenderer::generateValueLabel(const QString &format, float value) -//{ -// QString valueLabelFormat = format; -// Utils::ParamType valueParamType = Utils::findFormatParamType(valueLabelFormat); -// QByteArray valueFormatArray = valueLabelFormat.toUtf8(); -// return Utils::formatLabel(valueFormatArray, valueParamType, value); -//} - void Abstract3DRenderer::updateSelectionState(SelectionState state) { m_selectionState = state; diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index b94c5180..f5ca8d02 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -29,12 +29,7 @@ #ifndef ABSTRACT3DRENDERER_P_H #define ABSTRACT3DRENDERER_P_H -//#define DISPLAY_RENDER_SPEED - #include -#ifdef DISPLAY_RENDER_SPEED -#include -#endif #include "datavisualizationglobal_p.h" #include "abstract3dcontroller_p.h" @@ -163,12 +158,6 @@ protected: QString m_selectionLabel; LabelItem *m_selectionLabelItem; - -#ifdef DISPLAY_RENDER_SPEED - bool m_isFirstFrame; - QTime m_lastFrameTime; - GLint m_numFrames; -#endif }; QT_END_NAMESPACE_DATAVISUALIZATION diff --git a/src/datavisualization/engine/qabstract3dgraph.cpp b/src/datavisualization/engine/qabstract3dgraph.cpp index 8f3c56b9..703cd18b 100644 --- a/src/datavisualization/engine/qabstract3dgraph.cpp +++ b/src/datavisualization/engine/qabstract3dgraph.cpp @@ -363,7 +363,8 @@ bool QAbstract3DGraph::shadowsSupported() const /*! * \property QAbstract3DGraph::scene * - * This property contains the read only Q3DScene that can be used to access, for example, a camera object. + * This property contains the read only Q3DScene that can be used to access, for example, a camera + * object. */ Q3DScene *QAbstract3DGraph::scene() const { @@ -403,6 +404,39 @@ QImage QAbstract3DGraph::renderToImage(int msaaSamples, const QSize &imageSize) * \l {Axis Range Dragging With Labels Example}{example}. */ +/*! + * \property QAbstract3DGraph::measureFps + * \since Qt Data Visualization 1.1 + * + * If \c true, the rendering is done continuously instead of on demand, and currentFps property + * is updated. Defaults to false. + * + * \sa currentFps + */ +void QAbstract3DGraph::setMeasureFps(bool enable) +{ + d_ptr->m_visualController->setMeasureFps(enable); +} + +bool QAbstract3DGraph::measureFps() const +{ + return d_ptr->m_visualController->measureFps(); +} + +/*! + * \property QAbstract3DGraph::currentFps + * \since Qt Data Visualization 1.1 + * + * When fps measuring is enabled, the results for the last second are stored in this read-only + * property. It takes at least a second before this value updates after measurement is activated. + * + * \sa measureFps + */ +qreal QAbstract3DGraph::currentFps() const +{ + return d_ptr->m_visualController->currentFps(); +} + /*! * \internal */ @@ -540,6 +574,11 @@ void QAbstract3DGraphPrivate::setVisualController(Abstract3DController *controll &QAbstract3DGraphPrivate::handleAxisYChanged); QObject::connect(m_visualController, &Abstract3DController::axisZChanged, this, &QAbstract3DGraphPrivate::handleAxisZChanged); + + QObject::connect(m_visualController, &Abstract3DController::measureFpsChanged, q_ptr, + &QAbstract3DGraph::measureFpsChanged); + QObject::connect(m_visualController, &Abstract3DController::currentFpsChanged, q_ptr, + &QAbstract3DGraph::currentFpsChanged); } void QAbstract3DGraphPrivate::handleDevicePixelRatioChange() diff --git a/src/datavisualization/engine/qabstract3dgraph.h b/src/datavisualization/engine/qabstract3dgraph.h index 85ee484f..2f417c2f 100644 --- a/src/datavisualization/engine/qabstract3dgraph.h +++ b/src/datavisualization/engine/qabstract3dgraph.h @@ -40,6 +40,8 @@ class QT_DATAVISUALIZATION_EXPORT QAbstract3DGraph : public QWindow, protected Q Q_PROPERTY(SelectionFlags selectionMode READ selectionMode WRITE setSelectionMode NOTIFY selectionModeChanged) Q_PROPERTY(ShadowQuality shadowQuality READ shadowQuality WRITE setShadowQuality NOTIFY shadowQualityChanged) Q_PROPERTY(Q3DScene* scene READ scene) + Q_PROPERTY(bool measureFps READ measureFps WRITE setMeasureFps NOTIFY measureFpsChanged) + Q_PROPERTY(qreal currentFps READ currentFps NOTIFY currentFpsChanged) protected: explicit QAbstract3DGraph(QAbstract3DGraphPrivate *d, const QSurfaceFormat *format, @@ -106,6 +108,10 @@ public: QImage renderToImage(int msaaSamples = 0, const QSize &imageSize = QSize()); + void setMeasureFps(bool enable); + bool measureFps() const; + qreal currentFps() const; + protected: bool event(QEvent *event); void resizeEvent(QResizeEvent *event); @@ -118,13 +124,14 @@ protected: void mouseMoveEvent(QMouseEvent *event); void wheelEvent(QWheelEvent *event); - signals: void activeInputHandlerChanged(QAbstract3DInputHandler *inputHandler); void activeThemeChanged(Q3DTheme *theme); void selectionModeChanged(QAbstract3DGraph::SelectionFlags mode); void shadowQualityChanged(QAbstract3DGraph::ShadowQuality quality); void elementSelected(QAbstract3DGraph::ElementType type); + void measureFpsChanged(bool enabled); + void currentFpsChanged(qreal fps); private: Q_DISABLE_COPY(QAbstract3DGraph) -- cgit v1.2.3