[Qgis-psc] 2019 Grant Final reports: Rendering optimisation and labeling work

Marco Bernasocchi marco at qgis.org
Tue Dec 3 06:09:15 PST 2019


Thanks a lot Nyall!

On 03.12.19 03:25, Nyall Dawson wrote:
> Hi PSC, devs,
>
> Following the submission of the last part of our 2019 grant work, 
> here's a report detailing what was undertaken and achieved thanks to 
> these two funding grants:
>
>
> *Profile and optimise the QGIS vector rendering code*
>
> One of the most critical and important functions in the QGIS 
> application is rendering of vector map layers. QGIS has an extremely 
> powerful and flexible vector symbology engine, capable of some mind 
> blowing cartography and visual effects. For efficient use on both the 
> desktop and server, users require that QGIS rendering is as fast as it 
> possibly can be!
>
> During this grant project, we conducted in-depth research into code 
> "hot spots" and inefficiencies in the QGIS rendering code using a 
> number of code profiling tools. This work resulted in many 
> optimisations, including:
>
>   * Cache painter path for font marker when it doesn't change
>     (https://github.com/qgis/QGIS/pull/30860) - around 2x speed up for
>     font marker rendering
>   * Optimise checking for active properties
>     (https://github.com/qgis/QGIS/pull/30861)
>   * Fix expensive file modified time check is applied with every check
>     of svg/image cache (https://github.com/qgis/QGIS/pull/30862) -
>     dramatic speed up for SVG marker rendering (and SVG rendering
>     across QGIS in general)
>   * Optimise reading of multipoints from OGR
>     (https://github.com/qgis/QGIS/pull/30863) - speeds up use of
>     multipoint layers across QGIS in general (not just rendering)
>   * Don't perform costly calculation of symbol output units which we
>     don't use (https://github.com/qgis/QGIS/pull/30864) - speeds up
>     all vector rendering operations
>   * Fix unnecessary calculation of marker symbol bounds when labeling
>     is not required for a layer and symbols layers are in place
>     (https://github.com/qgis/QGIS/pull/30865) - speeds up rendering of
>     simple marker points matching this situation by around 3x
>   * Fix large speed regression in evaluating string equality
>     expressions (https://github.com/qgis/QGIS/pull/30866) - dramatic
>     improvement of expression calculation times across all of QGIS
>   * Avoid expensive symbol clones during label rendering
>     (https://github.com/qgis/QGIS/pull/30867)
>   * Speed up copying of paint effects
>     (https://github.com/qgis/QGIS/pull/30868)
>   * Add a reserve method to QgsGeometryCollection
>     (https://github.com/qgis/QGIS/pull/30892) - speeds up use of multi
>     geometry types across all of QGIS
>   * Avoid storing and cloning paint effects for layers if they are
>     just the default stack unchanged
>     (https://github.com/qgis/QGIS/pull/30896)
>   * Optimizations for shapeburst rendering
>     (https://github.com/qgis/QGIS/pull/30982)
>   * Much faster copying of expression contexts with a project scope
>     present (https://github.com/qgis/QGIS/pull/30983)
>   * Avoid lots of unnecessary work involving disabled label data
>     defined properties (https://github.com/qgis/QGIS/pull/30986)
>   * Optimisations to QgsProperty which greatly speed up data defined
>     symbology rendering in some circumstances
>     (https://github.com/qgis/QGIS/pull/31159)
>   * Big speedup when loading symbols with embedded paths
>     https://github.com/qgis/QGIS/pull/31333)
>   * Add a fast shortcut to rectangle/geometry intersection test
>     (https://github.com/qgis/QGIS/pull/31340)
>   * Speed up geometry equality checks by orders of magnitude
>     (https://github.com/qgis/QGIS/pull/31341)
>   * Speed up geometry operations involved in tracing and snapping
>     (https://github.com/qgis/QGIS/pull/31415)
>   * Avoid using expensive geos polygon overlap calculation for two
>     horizontal labels (https://github.com/qgis/QGIS/pull/31937) -
>     speeds up label rendering on complex maps
>   * Limit number of label candidates for large layers
>     (https://github.com/qgis/QGIS/pull/31975) - on complex projects
>     can reduce label rendering time by an order of magnitude
>
> While the focus of this work was on the vector rendering code, some of 
> the optimisations implemented have resulted in dramatic improvements 
> across other parts of QGIS also (such as certain Processing algorithms).
>
> These optimisations were made available in the QGIS 3.10.0 release, 
> with selected low-risk optimisations also being backported to the QGIS 
> 3.4 LTR series.
>
> *"Rebalance" the labeling engine and fix poor automatic label 
> placement choices*
> *
> *
> While QGIS has a powerful engine sitting behind its automatic label 
> placement, the labeling results generated by this engine were often 
> unpredictable and frustrating for users. Labels were frequently 
> positioned over other features, and regardless of how heavily users 
> tweaked the various label settings it could be impossible to avoid 
> these unwanted labels. Furthermore, the settings for controlling 
> individual layer label and feature obstacle priorities generally had 
> no discernible effect on the actual placement of labels on the map.
>
> During this work project we commenced by safe guarding the existing 
> label placement logic with a series of new carefully designed unit 
> tests covering a range of different label placement situations. We 
> then used these reference tests as a guide and re-worked the label 
> placement engine logic. Now, labels will never be placed over features 
> from a layer with a a higher obstacle weight when compared to the 
> label's priority.
>
> This logic dramatically simplifies the effect of labeling settings for 
> users, avoiding the complexities and bugs which were present in the 
> older approach.
>
> In order to avoid disrupting existing projects, the new labeling logic 
> is only used for newly created projects in QGIS 3.12 and later. We 
> added a mechanism to allow users to manually upgrade existing projects 
> to the newer logic, via the project's label settings dialog.
>
> Lastly, we used this opportunity to invest some much-needed time in 
> modernising and cleaning up the labeling engine code, to help make it 
> easier to understand and maintain in future.
>
> (https://github.com/qgis/QGIS/pull/33183)
>
>
>
> Nyall
>
>
>
>
>
> _______________________________________________
> Qgis-psc mailing list
> Qgis-psc at lists.osgeo.org
> https://lists.osgeo.org/mailman/listinfo/qgis-psc

-- 
Marco Bernasocchi

QGIS.org Co-chair
http://berna.io

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/qgis-psc/attachments/20191203/360d2714/attachment.html>


More information about the Qgis-psc mailing list