From 49bcf69a3bc9e73e0f81542b9747ead16f3117ae Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Mon, 11 Nov 2019 16:46:22 +0200 Subject: [PATCH] [core] Avoid GeoJSON source flickering on style transitions Before this change, all GeoJSON source cleared tile pyramid at the style transition and it caused flickering. Now, in Continuous mode, we keep the existing tiles until the new GeoJSON data is not yet available, thus providing smart style transitions without flickering. In other modes (Static, Tile) clear the tile pyramid in order to avoid render tests being flaky. --- .../sources/render_geojson_source.cpp | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/mbgl/renderer/sources/render_geojson_source.cpp b/src/mbgl/renderer/sources/render_geojson_source.cpp index 035244e37..67b4c48d9 100644 --- a/src/mbgl/renderer/sources/render_geojson_source.cpp +++ b/src/mbgl/renderer/sources/render_geojson_source.cpp @@ -85,26 +85,27 @@ void RenderGeoJSONSource::update(Immutable baseImpl_, enabled = needsRendering; auto data_ = impl().getData().lock(); + if (!data_) { + // In Continuous mode, keep the existing tiles if the new data_ is not + // yet available, thus providing smart style transitions without flickering. + // In other modes, allow clearing the tile pyramid first, before the early + // return in order to avoid render tests being flaky. + if (parameters.mode != MapMode::Continuous) tilePyramid.clearAll(); + return; + } if (data.lock() != data_) { data = data_; tilePyramid.reduceMemoryUse(); - - if (data_) { - const uint8_t maxZ = impl().getZoomRange().max; - for (const auto& pair : tilePyramid.getTiles()) { - if (pair.first.canonical.z <= maxZ) { - static_cast(pair.second.get())->updateData(data_->getTile(pair.first.canonical), needsRelayout); - } + const uint8_t maxZ = impl().getZoomRange().max; + for (const auto& pair : tilePyramid.getTiles()) { + if (pair.first.canonical.z <= maxZ) { + static_cast(pair.second.get()) + ->updateData(data_->getTile(pair.first.canonical), needsRelayout); } } } - if (!data_) { - tilePyramid.clearAll(); - return; - } - tilePyramid.update(layers, needsRendering, needsRelayout,