Skip to content

Commit

Permalink
Refine logic regarding vector layer rendering composition
Browse files Browse the repository at this point in the history
If previous layer render was relatively quick (eg < 3 seconds), then
we defer composition until the whole layer has been rendered.

If not, then we defer composition until either the first feature has been
rendered OR the render is taking a while and the map will benefit
from progressive updates
  • Loading branch information
nyalldawson committed Jan 27, 2021
1 parent bb746c6 commit 0edd4f9
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 0 deletions.
38 changes: 38 additions & 0 deletions src/core/vector/qgsvectorlayerrenderer.cpp
Expand Up @@ -44,6 +44,7 @@

#include <QPicture>

constexpr int MAX_TIME_TO_USE_CACHED_PREVIEW_IMAGE = 3000;

QgsVectorLayerRenderer::QgsVectorLayerRenderer( QgsVectorLayer *layer, QgsRenderContext &context )
: QgsMapLayerRenderer( layer->id(), &context )
Expand Down Expand Up @@ -178,10 +179,17 @@ QgsVectorLayerRenderer::QgsVectorLayerRenderer( QgsVectorLayer *layer, QgsRender
//layer properties require rasterization
mForceRasterRender = true;
}

mReadyToCompose = false;
}

QgsVectorLayerRenderer::~QgsVectorLayerRenderer() = default;

void QgsVectorLayerRenderer::setLayerRenderingTimeHint( int time )
{
mRenderTimeHint = time;
}

QgsFeedback *QgsVectorLayerRenderer::feedback() const
{
return mInterruptionChecker.get();
Expand All @@ -195,19 +203,33 @@ bool QgsVectorLayerRenderer::forceRasterRender() const
bool QgsVectorLayerRenderer::render()
{
if ( mGeometryType == QgsWkbTypes::NullGeometry || mGeometryType == QgsWkbTypes::UnknownGeometry )
{
mReadyToCompose = true;
return true;
}

if ( mRenderers.empty() )
{
mReadyToCompose = true;
mErrors.append( QObject::tr( "No renderer for drawing." ) );
return false;
}

// if the previous layer render was relatively quick (e.g. less than 3 seconds), the we show any previously
// cached version of the layer during rendering instead of the usual progressive updates
if ( mRenderTimeHint > 0 && mRenderTimeHint <= MAX_TIME_TO_USE_CACHED_PREVIEW_IMAGE )
{
mBlockRenderUpdates = true;
mElapsedTimer.start();
}

bool res = true;
for ( const std::unique_ptr< QgsFeatureRenderer > &renderer : mRenderers )
{
res = renderInternal( renderer.get() ) && res;
}

mReadyToCompose = true;
return res;
}

Expand Down Expand Up @@ -440,6 +462,14 @@ void QgsVectorLayerRenderer::drawRenderer( QgsFeatureRenderer *renderer, QgsFeat
// labeling - register feature
if ( rendered )
{
// as soon as first feature is rendered, we can start showing layer updates.
// but if we are blocking render updates (so that a previously cached image is being shown), we wait
// at most e.g. 3 seconds before we start forcing progressive updates.
if ( !mBlockRenderUpdates || mElapsedTimer.elapsed() > MAX_TIME_TO_USE_CACHED_PREVIEW_IMAGE )
{
mReadyToCompose = true;
}

// new labeling engine
if ( isMainRenderer && context.labelingEngine() && ( mLabelProvider || mDiagramProvider ) )
{
Expand Down Expand Up @@ -640,6 +670,14 @@ void QgsVectorLayerRenderer::drawRendererLevels( QgsFeatureRenderer *renderer, Q
try
{
renderer->renderFeature( *fit, context, layer, sel, drawMarker );

// as soon as first feature is rendered, we can start showing layer updates.
// but if we are blocking render updates (so that a previously cached image is being shown), we wait
// at most e.g. 3 seconds before we start forcing progressive updates.
if ( !mBlockRenderUpdates || mElapsedTimer.elapsed() > MAX_TIME_TO_USE_CACHED_PREVIEW_IMAGE )
{
mReadyToCompose = true;
}
}
catch ( const QgsCsException &cse )
{
Expand Down
7 changes: 7 additions & 0 deletions src/core/vector/qgsvectorlayerrenderer.h
Expand Up @@ -32,6 +32,7 @@ class QgsMapClippingRegion;

#include <QList>
#include <QPainter>
#include <QElapsedTimer>

typedef QList<int> QgsAttributeList;

Expand Down Expand Up @@ -89,6 +90,8 @@ class QgsVectorLayerRenderer : public QgsMapLayerRenderer

bool render() override;

void setLayerRenderingTimeHint( int time ) override;

private:

/**
Expand Down Expand Up @@ -172,6 +175,10 @@ class QgsVectorLayerRenderer : public QgsMapLayerRenderer
bool mApplyLabelClipGeometries = false;
bool mForceRasterRender = false;

int mRenderTimeHint = 0;
bool mBlockRenderUpdates = false;
QElapsedTimer mElapsedTimer;

};


Expand Down

0 comments on commit 0edd4f9

Please sign in to comment.