Re: A performance question... - summary
Brought to you by:
rathmann
From: Giacomo <gia...@el...> - 2011-07-04 13:34:14
|
Summing up, my application takes up to 20-22%CPU spread on two screens without labels. Drawing the labels as pixmaps, with the methods cited below, the CPU usage grows 10%, thus exceeding 30% Pixmaps are cached in a QMap<double, QPixmap> as follows: void PlotGrid::createHash(const QStringList &labels, const QList<double>& zpos) { int rWidth, rHeight; QFont f("", 9); QFontMetrics fm(f); QColor bgColor = Qt::white; bgColor.setAlpha(155); m_maxLabelHeight = 0; for(int i = 0; i < zpos.size(); i++) { QString label = labels.at(i); rWidth = fm.width(label); rHeight = fm.height(); if(rWidth > m_maxLabelHeight) m_maxLabelHeight = rWidth; QImage img(rWidth, rHeight, QImage::Format_ARGB6666_Premultiplied); QImage imgRot; QPainter p(&img); p.setPen(Qt::black); QMatrix matrix; matrix.rotate(90); img.fill(bgColor.rgb()); QRect r(QPoint(0,0), QSize(rWidth, rHeight)); p.drawText(QRect(0, 0, rWidth, rHeight), Qt::AlignHCenter|Qt::AlignVCenter, label); /* rotate image */ imgRot = img.transformed(matrix, Qt::SmoothTransformation); /* populate map */ m_map.insert(zpos.at(i), QPixmap::fromImage(imgRot)); } } Here's the draw method: void PlotGrid::draw(QPainter *p, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRect &rect) const { double dx, previousDx = 0.0, dy = m_maxLabelHeight; p->save(); QwtScaleDiv sd = xScaleDiv(); QwtValueList values = sd.ticks(QwtScaleDiv::MajorTick); p->translate(0, p->viewport().height() - dy); p->setPen(Qt::black); for(int i = 0; i < values.size(); i++) { QPixmap pix = m_map.value(values.at(i)); p->drawPixmap(xMap.transform(values.at(i)), 0, pix); } p->restore(); QwtPlotGrid::draw(p, xMap, yMap, rect); } The other draw operation, for the horizontal labels in the attached screenshot is equivalent, except that the QImage isn't rotated, so the code is even simpler. By the way, I wasn't able to set an alpha channel on the QImage/QPixmap :( The green strip between the green lines raises the cpu of another 15-20% (due to the alpha channel)... but I think this is inevitable... Thanks for all your advice. Il giorno ven, 01/07/2011 alle 17.09 +0200, Giacomo ha scritto: > Il giorno ven, 01/07/2011 alle 16.55 +0200, Uwe Rathmann ha scritto: > > > I will try replacing QImage with QPixmap then... > > > Replacing QImage with QPixmap reduced the load of another 10%. > The application now takes about 30% of CPU (Xorg)... still taking up > twice the cpu of other plots with the same refresh rate, but without > text/ text pixmaps. > > On monday I will try to polish the code even more. > > > > > I would implement a small dummy application, where you paint a text string > > 1000 times to a widget and another one, where you draw a pixmap 1000 times ( > > it doesn't matter what is in it ). > > > > Simply overload paintEvent, set up a QPainter and run the loops. > > > > > I'll give a look at backingstore, don't know what it is.. has it to do > > > with the PaintCached and PaintPacked attributes of QwtPlotCanvas? > > > > Yes, QwtPlotCanvas::PaintCached is the backing store ( in Qwt 6 this attribute > > is renamed to BackingStore ). Note, that Qt has another backing store. > > In my plot constructor I invoke these two > > setCanvasPaintCached(true); > setCanvasPaintPacked(true); > > hope this is the right choice and combination of the two. > > I'll let you know where I get on monday ... > > thanks a lot and have a nice weekend. > > Giacomo. > > > > > Uwe > > > > ------------------------------------------------------------------------------ > All of the data generated in your IT infrastructure is seriously valuable. > Why? It contains a definitive record of application performance, security > threats, fraudulent activity, and more. Splunk takes this data and makes > sense of it. IT sense. And common sense. > http://p.sf.net/sfu/splunk-d2d-c2 > _______________________________________________ > qwt-interest mailing list > qwt...@li... > https://lists.sourceforge.net/lists/listinfo/qwt-interest |