[Development] QT_XCB_NATIVE_PAINTING makes worse that without of it
Uwe Rathmann
Uwe.Rathmann at tigertal.de
Sat Mar 23 19:00:47 CET 2019
Ön Fri, 22 Mar 2019 17:06:32 +0100, Allan Sandfeld Jensen wrote:
> Sounds like XCB isn't as well optimized as Qt is
Nice joke - but only when X11 falls back on some software emulation it
might be the case, that the Qt implementation is better than that one.
> Note though, that there are number of techniques to make the native
> painting faster, such as always using qpixmap so the images stays
> buffered on the server side.
Unfortunately after removing the X11 paint engine with Qt5 the Qt
development started to rely on the fact, that QPixmap::toImage() is a
cheap operation - what is not true anymore since Qt 5.10 and
QT_XCB_NATIVE_PAINTING.
F.e. in qquickpixmapcache.cpp you find code like this for creating
textures for QQmlImageProviderBase::Pixmap:
QQuickTextureFactory::textureFactoryForImage( pixmap.toImage() ) );
Here Qt/Quick is affected, but I have seen stuff like this in the Qt/
Charts module and there are probably more ...
> You might be able to massage your program to be faster with native
> painting, but the whole reason for switching to Qt side painting was
> that for the average application developer Qt side was faster.
Not sure what "average" means, but when talking about vector graphics
this nothing but wrong. I had posted statistics some years ago showing
how much slower software rendering for the type of use case you have
with Qwt:
my test was about creating the same QImage using QPainter::drawPolyline
in 3 ways:
- Drawing to a QImage ( = raster paint engine )
- Drawing to a QPixmap + copying it out to a QImage ( X11 paint engine )
- Drawing to an FBO + copying it out to a QImage ( OpenGL paint engine )
I don't have the numbers anymore, but IIRC on my box OpenGL/X11 were >
10 times faster than what the raster paint engine does - even if the
numbers include an irrelevant QPixmap -> QImage operation for OpenGL/X11
and the time for the QImage upload for the raster paint engine path is
missing.
Uwe
More information about the Development
mailing list