[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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user