[Development] Charts and DataVis Questions
Sean Harmer
sh at theharmers.co.uk
Sat Jan 23 19:52:24 CET 2016
On 23/01/2016 12:45, Uwe Rathmann wrote:
> Hi,
>
>> The OpenGL acceleration in Charts module is really impressive ...
> Unfortunately part of the truth is, that the performance of the software
> renderer does not necessarily be that far behind.
Now try it against OpenGL with 100k points rendering to a 4k screen. The
difference between software and hardware will increase with those
parameters (up to some fill rate or vertex rate that the hardware can
handle).
Cheers,
Sean
>
> An example: in a test program I'm creating a polygon of 10000 points in
> an area of 1000x1000 using (qAbs(random) % 1000) and then I'm drawing it
> this way:
>
> void draw( const QPolygonF &points, QPaintDevice &paintDevice )
> {
> QPainter painter( &paintDevice );
> painter.setPen( QPen( Qt::black, 2 ) );
> painter.drawPolyline( points );
> painter.end();
> }
>
>
> As I want to compare hardware vs. software renderer I'm using Qt 4.8 with
> X11 ( "native" ) as backend. Here drawing to a QImage uses the software
> renderer, while drawing to a pixmap is usually hardware accelerated.
>
> To make it comparable I'm converting the pixmap to an image, so that I
> have the same input and the same output. ( in case you are interested I
> added the code at the end of this posting. )
>
> O.k. this is what I see with Qt 4.8:
>
> - Raster 735ms
> - X11 120ms
>
> When doing the same with a Qt-5.6 beta:
>
> - Raster 775ms
> - X11 775ms ( no surprise )
>
>
> Next I modified the draw method a bit:
>
> void draw( const QPolygonF &points, QPaintDevice &paintDevice )
> {
> QPainter painter( &paintDevice );
> painter.setPen( QPen( Qt::black, 2 ) );
>
> const int numPoints = 100;
> const int numChunks = points.size() / numPoints;
> for ( int i = 0; i < numChunks; i++ )
> {
> painter.drawPolyline( points.constData() + i * numPoints,
> numPoints );
> }
> painter.end();
> }
>
> ( of course this is not exactly the same as the pixels to join the chunks
> at there ends are missing ).
>
> Now the result is:
>
> Raster ( Qt 4.8 ): 382ms
> Raster ( Qt 5.6 ): 403ms
>
> When using a chunk size ( = numPoints ) of 10 I have:
>
> Raster ( Qt 4.8 ): 192
> Raster ( Qt 5.6 ): 181
> X11 ( Qt 4.8 ): 93
>
> In the end the implementation of a chart package is full of finding and
> implementing workarounds and optimizations like this one - at least this
> is my experience with being the maintainer of a chart package ( Qwt )
> over the years.
>
> Uwe
>
> --
>
>
> QImage renderRaster( const QPolygonF &points )
> {
> QImage img( 1000, 1000, QImage::Format_RGB32 );
> img.fill( Qt::white );
>
> QElapsedTimer timer;
> timer.start();
>
> draw( points, img );
>
> qDebug() << "Raster" << timer.elapsed();
>
> return img;
> }
>
> QImage renderX11( const QPolygonF &points )
> {
> QPixmap pm( 1000, 1000 );
> pm.fill( Qt::white );
>
> QElapsedTimer timer;
> timer.start();
>
> draw( points, pm );
>
> const QImage img = pm.toImage();
> qDebug() << "X11" << timer.elapsed();
>
> return img;
> }
>
> _______________________________________________
> Development mailing list
> Development at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/development
More information about the Development
mailing list