[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.
This commit is contained in:
Mikhail Pozdnyakov
2019-11-11 16:46:22 +02:00
parent bd5397a886
commit 49bcf69a3b

View File

@@ -85,26 +85,27 @@ void RenderGeoJSONSource::update(Immutable<style::Source::Impl> 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<GeoJSONTile*>(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<GeoJSONTile*>(pair.second.get())
->updateData(data_->getTile(pair.first.canonical), needsRelayout);
}
}
}
if (!data_) {
tilePyramid.clearAll();
return;
}
tilePyramid.update(layers,
needsRendering,
needsRelayout,