forked from qt-creator/qt-creator
QmlProfiler: Use SortedTimelineModel for paint events
Change-Id: Ib511897b5a314d36e906d7c52a09a88c281925fc Reviewed-by: Kai Koehne <kai.koehne@digia.com>
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user