[Qt-interest] Painting on QImage vs. QPixmap

André Somers andre at familiesomers.nl
Tue Mar 24 21:17:45 CET 2009


Hi,

Without going into the details of your post, maybe you should read this 
blogpost before doing more benchmarking:
http://zrusin.blogspot.com/2009/03/kde-graphics-benchmarks.html

Zack is a "graphics ninja" that among other places used to work for 
Trolltech.

André


"Brad Howes" <howes at ll.mit.edu> schreef in bericht 
news:77BA2F88-4AE8-4CA6-B4B0-135430FD76EA at ll.mit.edu...
> I wrote a simple application to measure whether QPainting on a QImage  was 
> faster than doing so on a QPixmap. Interestingly, it depends on  what 
> operations you are doing. The source (scooby.tgz) is available at
>
>     http://idisk.mac.com/bradhowes-Public?view=web
>
> At least on my MacBook Pro running Qt 4.5 it is measurably slower to  do 
> indexing into a QImage (via setPixel) and then convert the QImage  into a 
> QPixmap for displaying vs. using QPainter to draw directly into  a QPixmap 
> via drawPoints (all the same color). However, if I request  that each 
> pixel get its own color, then QImage wins.
>
> I'd be curious if anyone can speed these cases up (the code is  *really* 
> simple). Here are the two drawing routines:
>
> void
> MainWindow::doImageUpdate()
> {
>     bool colorPerPixel = ui_.colorPerPixel->isChecked();
>     QRgb color( qrand() );
>     size_t count = ui_.pixelCount->value();
>     while ( count-- ) {
> image_.setPixel( QPoint( x_++, y_ ), color );
> if ( colorPerPixel )
>     color = QRgb( qrand() );
>
> if ( x_ == ui_.image->width() ) {
>     x_ = 0;
>     ++y_;
> }
> if ( y_ == ui_.image->height() ) {
>     y_ = 0;
> }
>     }
>
>     pixmap_ = QPixmap::fromImage( image_ );
>     ui_.image->setPixmap( pixmap_ );
> }
>
> void
> MainWindow::doPixmapUpdate()
> {
>     QPainter painter;
>     painter.begin( &pixmap_ );
>     if ( ui_.colorPerPixel->isChecked() ) {
> size_t count = ui_.pixelCount->value();
> while ( count-- ) {
>     QRgb color( qrand() );
>     painter.setPen( color );
>     painter.drawPoint( QPoint( x_++, y_ ) );
>     if ( x_ == ui_.image->width() ) {
> x_ = 0;
> ++y_;
>     }
>     if ( y_ == ui_.image->height() ) {
> y_ = 0;
>     }
> }
>     }
>     else {
> std::vector<QPoint> points( ui_.pixelCount->value() );
> for ( size_t index = 0; index < points.size(); ++index ) {
>     points[ index ] = QPoint( x_++, y_ );
>     if ( x_ == ui_.image->width() ) {
> x_ = 0;
> ++y_;
>     }
>     if ( y_ == ui_.image->height() ) {
> y_ = 0;
>     }
> }
>
> QRgb color( qrand() );
> painter.setPen( color );
> painter.drawPoints( &points[ 0 ], points.size() );
> painter.end();
>     }
>
>     ui_.image->setPixmap( pixmap_ );
> }
>
>
>
> Brad
>
> -- 
> Brad Howes
> Group 42
> MIT Lincoln Laboratory • 244 Wood St. • Lexington, MA 02173
> Phone: 781.981.5292 • Fax: 781.981.3495 • Secretary: 781.981.7420
>
>
>
> 



More information about the Qt-interest-old mailing list