QmlProfiler: tracking animations
authorChristiaan Janssen <christiaan.janssen@nokia.com>
Fri, 7 Oct 2011 12:51:07 +0000 (14:51 +0200)
committerQt by Nokia <qt-info@nokia.com>
Tue, 11 Oct 2011 11:21:14 +0000 (13:21 +0200)
Change-Id: I78fa5ed5385dfe1715c9d05a5e63eb7185870e61
Reviewed-on: http://codereview.qt-project.org/6254
Reviewed-by: Kai Koehne <kai.koehne@nokia.com>
Sanity-Review: Qt Sanity Bot <qt_sanity_bot@ovi.com>

src/declarative/debugger/qdeclarativedebugtrace.cpp
src/declarative/debugger/qdeclarativedebugtrace_p.h

index 76e4e23..f9eb171 100644 (file)
@@ -47,6 +47,9 @@
 #include <QtCore/qthread.h>
 #include <QtCore/qcoreapplication.h>
 
+// this contains QUnifiedTimer
+#include <private/qabstractanimation_p.h>
+
 QT_BEGIN_NAMESPACE
 
 Q_GLOBAL_STATIC(QDeclarativeDebugTrace, traceInstance);
@@ -64,6 +67,9 @@ QByteArray QDeclarativeDebugData::toByteArray() const
         ds << detailData;
     if (messageType == (int)QDeclarativeDebugTrace::RangeLocation)
         ds << detailData << line;
+    if (messageType == (int)QDeclarativeDebugTrace::Event &&
+            detailType == (int)QDeclarativeDebugTrace::AnimationFrame)
+        ds << framerate << animationcount;
     return data;
 }
 
@@ -76,9 +82,17 @@ QDeclarativeDebugTrace::QDeclarativeDebugTrace()
         // wait for first message indicating whether to trace or not
         while (!m_messageReceived)
             waitForMessage();
+
+        QUnifiedTimer::instance()->registerProfilerCallback( &animationFrame );
     }
 }
 
+QDeclarativeDebugTrace::~QDeclarativeDebugTrace()
+{
+    // unregister the callback
+    QUnifiedTimer::instance()->registerProfilerCallback( 0 );
+}
+
 void QDeclarativeDebugTrace::addEngine(QDeclarativeEngine * /*engine*/)
 {
     // just make sure that the service is properly registered
@@ -87,6 +101,7 @@ void QDeclarativeDebugTrace::addEngine(QDeclarativeEngine * /*engine*/)
 
 void QDeclarativeDebugTrace::removeEngine(QDeclarativeEngine */*engine*/)
 {
+
 }
 
 void QDeclarativeDebugTrace::addEvent(EventType t)
@@ -131,12 +146,18 @@ void QDeclarativeDebugTrace::endRange(RangeType t)
         traceInstance()->endRangeImpl(t);
 }
 
+void QDeclarativeDebugTrace::animationFrame(qint64 delta)
+{
+    Q_ASSERT(QDeclarativeDebugService::isDebuggingEnabled());
+    traceInstance()->animationFrameImpl(delta);
+}
+
 void QDeclarativeDebugTrace::addEventImpl(EventType event)
 {
     if (status() != Enabled || !m_enabled)
         return;
 
-    QDeclarativeDebugData ed = {m_timer.nsecsElapsed(), (int)Event, (int)event, QString(), -1};
+    QDeclarativeDebugData ed = {m_timer.nsecsElapsed(), (int)Event, (int)event, QString(), -1, 0, 0};
     processMessage(ed);
 }
 
@@ -145,7 +166,7 @@ void QDeclarativeDebugTrace::startRangeImpl(RangeType range)
     if (status() != Enabled || !m_enabled)
         return;
 
-    QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeStart, (int)range, QString(), -1};
+    QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeStart, (int)range, QString(), -1, 0, 0};
     processMessage(rd);
 }
 
@@ -154,7 +175,7 @@ void QDeclarativeDebugTrace::rangeDataImpl(RangeType range, const QString &rData
     if (status() != Enabled || !m_enabled)
         return;
 
-    QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range, rData, -1};
+    QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range, rData, -1, 0, 0};
     processMessage(rd);
 }
 
@@ -163,7 +184,7 @@ void QDeclarativeDebugTrace::rangeDataImpl(RangeType range, const QUrl &rData)
     if (status() != Enabled || !m_enabled)
         return;
 
-    QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range, rData.toString(QUrl::FormattingOption(0x100)), -1};
+    QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range, rData.toString(QUrl::FormattingOption(0x100)), -1, 0, 0};
     processMessage(rd);
 }
 
@@ -172,7 +193,7 @@ void QDeclarativeDebugTrace::rangeLocationImpl(RangeType range, const QString &f
     if (status() != Enabled || !m_enabled)
         return;
 
-    QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range, fileName, line};
+    QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range, fileName, line, 0, 0};
     processMessage(rd);
 }
 
@@ -181,7 +202,7 @@ void QDeclarativeDebugTrace::rangeLocationImpl(RangeType range, const QUrl &file
     if (status() != Enabled || !m_enabled)
         return;
 
-    QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range, fileName.toString(QUrl::FormattingOption(0x100)), line};
+    QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range, fileName.toString(QUrl::FormattingOption(0x100)), line, 0, 0};
     processMessage(rd);
 }
 
@@ -190,10 +211,25 @@ void QDeclarativeDebugTrace::endRangeImpl(RangeType range)
     if (status() != Enabled || !m_enabled)
         return;
 
-    QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeEnd, (int)range, QString(), -1};
+    QDeclarativeDebugData rd = {m_timer.nsecsElapsed(), (int)RangeEnd, (int)range, QString(), -1, 0, 0};
     processMessage(rd);
 }
 
+void QDeclarativeDebugTrace::animationFrameImpl(qint64 delta)
+{
+    if (status() != Enabled || !m_enabled)
+        return;
+
+    int animCount = QUnifiedTimer::instance()->runningAnimationCount();
+
+    if (animCount > 0 && delta > 0) {
+        // trim fps to integer
+        int fps = 1000 / delta;
+        QDeclarativeDebugData ed = {m_timer.nsecsElapsed(), (int)Event, (int)AnimationFrame, QString(), -1, fps, animCount};
+        processMessage(ed);
+    }
+}
+
 /*
     Either send the message directly, or queue up
     a list of messages to send later (via sendMessages)
index 06c4311..7633c21 100644 (file)
@@ -70,6 +70,8 @@ struct QDeclarativeDebugData
     //###
     QString detailData; //used by RangeData and RangeLocation
     int line;           //used by RangeLocation
+    int framerate;      //used by animation events
+    int animationcount; //used by animation events
 
     QByteArray toByteArray() const;
 };
@@ -95,6 +97,7 @@ public:
         FramePaint,
         Mouse,
         Key,
+        AnimationFrame,
 
         MaximumEventType
     };
@@ -120,8 +123,10 @@ public:
     static void rangeLocation(RangeType, const QString &, int);
     static void rangeLocation(RangeType, const QUrl &, int);
     static void endRange(RangeType);
+    static void animationFrame(qint64);
 
     QDeclarativeDebugTrace();
+    ~QDeclarativeDebugTrace();
 protected:
     virtual void messageReceived(const QByteArray &);
 private:
@@ -132,6 +137,7 @@ private:
     void rangeLocationImpl(RangeType, const QString &, int);
     void rangeLocationImpl(RangeType, const QUrl &, int);
     void endRangeImpl(RangeType);
+    void animationFrameImpl(qint64);
     void processMessage(const QDeclarativeDebugData &);
     void sendMessages();
     QElapsedTimer m_timer;