[Interest] How to render small Images decently on non retina displays with QtQuick?

Uwe Rathmann Uwe.Rathmann at tigertal.de
Thu Mar 15 18:26:12 CET 2018


On Thu, 15 Mar 2018 14:26:41 +0000, Shawn Rutledge wrote:

>> I see that Uwe has pointed out a performance issue which can happen
>> because of multiple renderings due to size changes. Is that it? Or are
>> there other reasons behind preferring PNG icons over SVG?
> 
> I think it’s mainly that SVG rendering is slow because it’s done in
> software,  ...

In our use case we have more of 1000 different SVGs - all of them small 
and simple - the type of icons you usually have on buttons.
For those I can't confirm, having any performance problems with rendering 
them.

The problems we noticed are related to the classes in Qt/Quick core:

a) QQuickImage

The caching strategy of QQuickImage, does not take into count, that 
scalable graphic formats do not offer a reasonable source size and that 
it doesn't make sense to render anything before the layout system has 
calculated the final size for the image.

But this one is not a serious problem as long as you are aware that 
QQuickImage is for raster data formats and for all sort of vector base 
images better use QQuickPaintedItem.

b) QQuickItem

QQuickItem and friends are not careful about avoiding geometryChanged 
notifications. Binding sizes results in setting width/height in 2 
separate call resulting in 2 geometryChange events.

Even worse: QQuickItem does not even have a public API where you can set 
its geometry in one call. Without using the private APIs you have to set 
size and position in 2 calls - always resulting in 2 geometryChanged 
notifications.

And here we are talking of a public C++ API - the one for the base class 
of all Qt/Quick Items !

c) Layouting

With QWidgets layout update requests are indicated by an event 
( LayoutRequest ) to the parent and usually processed asynchronously. 
This way several layout requests can be collected and lead to one 
calculation only.

When binding implicitSize properties this is not the case and leads to 
several updates - often irrelevant as only the last one is important.

In QSkinny I implemented a layout system, that is similar to what QWidgets 
does. Layout Requests are not processed before updatePolish.

Something I have not yet fixed in our environment is, that layouting 
always has to be done in top/down order. That requires sorting the items 
in the to-be-polished list. I would expect to see some nice improvements 
in our ( already almost non existing ) startup time.

d) Once more QQuickImage

>From what I written above my conclusion is, that no class should do any 
expensive operation in geometryChanged.

--

Finally an unrelated comment on QQuickItem::geometryChanged, 
QQuickItem::itemChange and QQuickItemChangeListener: 

why do those APIs exist at all ?

Sending events is a well established mechanism that exists since ever and 
event filtering is public, available and more powerful ( swallow events ) 
than those listeners.

ciao,
Uwe







More information about the Interest mailing list