QmlProfiler: Use SortedTimelineModel for paint events

Change-Id: Ib511897b5a314d36e906d7c52a09a88c281925fc
Reviewed-by: Kai Koehne <kai.koehne@digia.com>
This commit is contained in:
Ulf Hermann
2013-12-04 16:48:00 +01:00
parent f10afe69a5
commit 5368188377
2 changed files with 41 additions and 97 deletions

View File

@@ -30,6 +30,7 @@
#include "qmlprofilerpainteventsmodelproxy.h" #include "qmlprofilerpainteventsmodelproxy.h"
#include "qmlprofilermodelmanager.h" #include "qmlprofilermodelmanager.h"
#include "qmlprofilersimplemodel.h" #include "qmlprofilersimplemodel.h"
#include "sortedtimelinemodel.h"
#include <QCoreApplication> #include <QCoreApplication>
#include <QVector> #include <QVector>
@@ -49,7 +50,7 @@ struct CategorySpan {
int contractedRows; int contractedRows;
}; };
class PaintEventsModelProxy::PaintEventsModelProxyPrivate class PaintEventsModelProxy::PaintEventsModelProxyPrivate : public SortedTimelineModel<QmlPaintEventData>
{ {
public: public:
PaintEventsModelProxyPrivate(PaintEventsModelProxy *qq) : q(qq) {} PaintEventsModelProxyPrivate(PaintEventsModelProxy *qq) : q(qq) {}
@@ -58,7 +59,6 @@ public:
QString displayTime(double time); QString displayTime(double time);
void computeAnimationCountLimit(); void computeAnimationCountLimit();
QVector <PaintEventsModelProxy::QmlPaintEventData> eventList;
int minAnimationCount; int minAnimationCount;
int maxAnimationCount; int maxAnimationCount;
bool expanded; bool expanded;
@@ -94,35 +94,15 @@ QString PaintEventsModelProxy::name() const
return QLatin1String("PaintEventsModelProxy"); return QLatin1String("PaintEventsModelProxy");
} }
const QVector<PaintEventsModelProxy::QmlPaintEventData> PaintEventsModelProxy::getData() const
{
return d->eventList;
}
const QVector<PaintEventsModelProxy::QmlPaintEventData> PaintEventsModelProxy::getData(qint64 fromTime, qint64 toTime) const
{
int fromIndex = findFirstIndex(fromTime);
int toIndex = findLastIndex(toTime);
if (fromIndex != -1 && toIndex > fromIndex)
return d->eventList.mid(fromIndex, toIndex - fromIndex + 1);
else
return QVector<PaintEventsModelProxy::QmlPaintEventData>();
}
void PaintEventsModelProxy::clear() void PaintEventsModelProxy::clear()
{ {
d->eventList.clear(); d->SortedTimelineModel::clear();
d->minAnimationCount = 1; d->minAnimationCount = 1;
d->maxAnimationCount = 1; d->maxAnimationCount = 1;
d->expanded = false; d->expanded = false;
m_modelManager->modelProxyCountUpdated(m_modelId, 0, 1); m_modelManager->modelProxyCountUpdated(m_modelId, 0, 1);
} }
bool compareStartTimes(const PaintEventsModelProxy::QmlPaintEventData &t1, const PaintEventsModelProxy::QmlPaintEventData &t2)
{
return t1.startTime < t2.startTime;
}
bool PaintEventsModelProxy::eventAccepted(const QmlProfilerSimpleModel::QmlEventData &event) const bool PaintEventsModelProxy::eventAccepted(const QmlProfilerSimpleModel::QmlEventData &event) const
{ {
return (event.eventType == QmlDebug::Painting && event.bindingType == QmlDebug::AnimationFrame); return (event.eventType == QmlDebug::Painting && event.bindingType == QmlDebug::AnimationFrame);
@@ -137,6 +117,11 @@ void PaintEventsModelProxy::loadData()
// collect events // collect events
const QVector<QmlProfilerSimpleModel::QmlEventData> referenceList = simpleModel->getEvents(); const QVector<QmlProfilerSimpleModel::QmlEventData> referenceList = simpleModel->getEvents();
QmlPaintEventData lastEvent;
qint64 lastStartTime = -1;
qint64 lastDuration = -1;
foreach (const QmlProfilerSimpleModel::QmlEventData &event, referenceList) { foreach (const QmlProfilerSimpleModel::QmlEventData &event, referenceList) {
if (!eventAccepted(event)) if (!eventAccepted(event))
continue; continue;
@@ -151,30 +136,29 @@ void PaintEventsModelProxy::loadData()
// the duration of the events is estimated from the framerate // the duration of the events is estimated from the framerate
// we need to correct it before appending a new event // we need to correct it before appending a new event
if (d->eventList.count() > 0) { if (lastStartTime != -1) {
QmlPaintEventData *lastEvent = &d->eventList[d->eventList.count()-1]; if (lastStartTime + lastDuration >= realStartTime) {
if (lastEvent->startTime + lastEvent->duration >= realStartTime) {
// 1 nanosecond less to prevent overlap // 1 nanosecond less to prevent overlap
lastEvent->duration = realStartTime - lastEvent->startTime - 1; lastDuration = realStartTime - lastStartTime - 1;
lastEvent->framerate = 1e9/lastEvent->duration; lastEvent.framerate = 1e9 / lastDuration;
} }
} }
QmlPaintEventData newEvent = { d->insert(lastStartTime, lastDuration, lastEvent);
realStartTime,
estimatedDuration,
(int)event.numericData1,
(int)event.numericData2
};
d->eventList.append(newEvent); lastEvent.framerate = (int)event.numericData1;
lastEvent.animationcount = (int)event.numericData2;
lastStartTime = realStartTime;
lastDuration = estimatedDuration;
m_modelManager->modelProxyCountUpdated(m_modelId, d->eventList.count(), referenceList.count()); m_modelManager->modelProxyCountUpdated(m_modelId, d->count(), referenceList.count());
} }
d->computeAnimationCountLimit(); if (lastStartTime != -1)
d->insert(lastStartTime, lastDuration, lastEvent);
qSort(d->eventList.begin(), d->eventList.end(), compareStartTimes); d->computeAnimationCountLimit();
d->computeNesting();
m_modelManager->modelProxyCountUpdated(m_modelId, 1, 1); m_modelManager->modelProxyCountUpdated(m_modelId, 1, 1);
@@ -190,12 +174,12 @@ bool PaintEventsModelProxy::isEmpty() const
int PaintEventsModelProxy::count() const int PaintEventsModelProxy::count() const
{ {
return d->eventList.count(); return d->count();
} }
qint64 PaintEventsModelProxy::lastTimeMark() const qint64 PaintEventsModelProxy::lastTimeMark() const
{ {
return d->eventList.last().startTime + d->eventList.last().duration; return d->lastEndTime();
} }
bool PaintEventsModelProxy::expanded(int ) const bool PaintEventsModelProxy::expanded(int ) const
@@ -233,53 +217,17 @@ const QString PaintEventsModelProxy::categoryLabel(int categoryIndex) const
int PaintEventsModelProxy::findFirstIndex(qint64 startTime) const int PaintEventsModelProxy::findFirstIndex(qint64 startTime) const
{ {
return findFirstIndexNoParents(startTime); return d->findFirstIndex(startTime);
} }
int PaintEventsModelProxy::findFirstIndexNoParents(qint64 startTime) const int PaintEventsModelProxy::findFirstIndexNoParents(qint64 startTime) const
{ {
if (d->eventList.isEmpty()) return d->findFirstIndexNoParents(startTime);
return -1;
if (d->eventList.count() == 1 || d->eventList.first().startTime+d->eventList.first().duration >= startTime)
return 0;
else
if (d->eventList.last().startTime+d->eventList.last().duration <= startTime)
return -1;
int fromIndex = 0;
int toIndex = d->eventList.count()-1;
while (toIndex - fromIndex > 1) {
int midIndex = (fromIndex + toIndex)/2;
if (d->eventList[midIndex].startTime + d->eventList[midIndex].duration < startTime)
fromIndex = midIndex;
else
toIndex = midIndex;
}
return toIndex;
} }
int PaintEventsModelProxy::findLastIndex(qint64 endTime) const int PaintEventsModelProxy::findLastIndex(qint64 endTime) const
{ {
if (d->eventList.isEmpty()) return d->findLastIndex(endTime);
return -1;
if (d->eventList.first().startTime >= endTime)
return -1;
if (d->eventList.count() == 1)
return 0;
if (d->eventList.last().startTime <= endTime)
return d->eventList.count()-1;
int fromIndex = 0;
int toIndex = d->eventList.count()-1;
while (toIndex - fromIndex > 1) {
int midIndex = (fromIndex + toIndex)/2;
if (d->eventList[midIndex].startTime < endTime)
fromIndex = midIndex;
else
toIndex = midIndex;
}
return fromIndex;
} }
int PaintEventsModelProxy::getEventType(int index) const int PaintEventsModelProxy::getEventType(int index) const
@@ -303,17 +251,17 @@ int PaintEventsModelProxy::getEventRow(int index) const
qint64 PaintEventsModelProxy::getDuration(int index) const qint64 PaintEventsModelProxy::getDuration(int index) const
{ {
return d->eventList[index].duration; return d->range(index).duration;
} }
qint64 PaintEventsModelProxy::getStartTime(int index) const qint64 PaintEventsModelProxy::getStartTime(int index) const
{ {
return d->eventList[index].startTime; return d->range(index).start;
} }
qint64 PaintEventsModelProxy::getEndTime(int index) const qint64 PaintEventsModelProxy::getEndTime(int index) const
{ {
return d->eventList[index].startTime + d->eventList[index].duration; return d->range(index).start + d->range(index).duration;
} }
int PaintEventsModelProxy::getEventId(int index) const int PaintEventsModelProxy::getEventId(int index) const
@@ -325,7 +273,7 @@ int PaintEventsModelProxy::getEventId(int index) const
QColor PaintEventsModelProxy::getColor(int index) const QColor PaintEventsModelProxy::getColor(int index) const
{ {
double fpsFraction = d->eventList[index].framerate / 60.0; double fpsFraction = d->range(index).framerate / 60.0;
if (fpsFraction > 1.0) if (fpsFraction > 1.0)
fpsFraction = 1.0; fpsFraction = 1.0;
if (fpsFraction < 0.0) if (fpsFraction < 0.0)
@@ -338,7 +286,7 @@ float PaintEventsModelProxy::getHeight(int index) const
float scale = d->maxAnimationCount - d->minAnimationCount; float scale = d->maxAnimationCount - d->minAnimationCount;
float fraction = 1.0f; float fraction = 1.0f;
if (scale > 1) if (scale > 1)
fraction = (float)(d->eventList[index].animationcount - fraction = (float)(d->range(index).animationcount -
d->minAnimationCount) / scale; d->minAnimationCount) / scale;
return fraction * 0.85f + 0.15f; return fraction * 0.85f + 0.15f;
@@ -374,14 +322,14 @@ void PaintEventsModelProxy::PaintEventsModelProxyPrivate::computeAnimationCountL
{ {
minAnimationCount = 1; minAnimationCount = 1;
maxAnimationCount = 1; maxAnimationCount = 1;
if (eventList.isEmpty()) if (count() == 0)
return; return;
for (int i=0; i < eventList.count(); i++) { for (int i=0; i < count(); i++) {
if (eventList[i].animationcount < minAnimationCount) if (range(i).animationcount < minAnimationCount)
minAnimationCount = eventList[i].animationcount; minAnimationCount = range(i).animationcount;
if (eventList[i].animationcount > maxAnimationCount) else if (range(i).animationcount > maxAnimationCount)
maxAnimationCount = eventList[i].animationcount; maxAnimationCount = range(i).animationcount;
} }
} }
@@ -400,21 +348,21 @@ const QVariantList PaintEventsModelProxy::getEventDetails(int index) const
// duration // duration
{ {
QVariantMap valuePair; QVariantMap valuePair;
valuePair.insert(QCoreApplication::translate(trContext, "Duration:"), QVariant(d->displayTime(d->eventList[index].duration))); valuePair.insert(QCoreApplication::translate(trContext, "Duration:"), QVariant(d->displayTime(d->range(index).duration)));
result << valuePair; result << valuePair;
} }
// duration // duration
{ {
QVariantMap valuePair; QVariantMap valuePair;
valuePair.insert(QCoreApplication::translate(trContext, "Framerate:"), QVariant(QString::fromLatin1("%1 FPS").arg(d->eventList[index].framerate))); valuePair.insert(QCoreApplication::translate(trContext, "Framerate:"), QVariant(QString::fromLatin1("%1 FPS").arg(d->range(index).framerate)));
result << valuePair; result << valuePair;
} }
// duration // duration
{ {
QVariantMap valuePair; QVariantMap valuePair;
valuePair.insert(QCoreApplication::translate(trContext, "Animations:"), QVariant(QString::fromLatin1("%1").arg(d->eventList[index].animationcount))); valuePair.insert(QCoreApplication::translate(trContext, "Animations:"), QVariant(QString::fromLatin1("%1").arg(d->range(index).animationcount)));
result << valuePair; result << valuePair;
} }

View File

@@ -56,8 +56,6 @@ class PaintEventsModelProxy : public AbstractTimelineModel
public: public:
struct QmlPaintEventData { struct QmlPaintEventData {
qint64 startTime;
qint64 duration;
int framerate; int framerate;
int animationcount; int animationcount;
}; };
@@ -70,8 +68,6 @@ public:
QStringList categoryTitles() const; QStringList categoryTitles() const;
QString name() const; QString name() const;
const QVector<QmlPaintEventData> getData() const;
const QVector<QmlPaintEventData> getData(qint64 fromTime, qint64 toTime) const;
void loadData(); void loadData();
Q_INVOKABLE int count() const; Q_INVOKABLE int count() const;
void clear(); void clear();