From ef8017198ce8f0bd79ba5a5ed31e35a16e3433bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Mon, 19 Sep 2016 15:54:13 +0200 Subject: [core] remove tiles for disabled sources When no layer of a source is visible anymore, we are now evicting tiles that are still stored in that source and move them to the cache. --- src/mbgl/style/source_impl.cpp | 24 ++++++++++++++++++------ src/mbgl/style/source_impl.hpp | 4 ++++ src/mbgl/style/style.cpp | 9 +++++++++ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/mbgl/style/source_impl.cpp b/src/mbgl/style/source_impl.cpp index 1fb6d59f0e..68e2feed1b 100644 --- a/src/mbgl/style/source_impl.cpp +++ b/src/mbgl/style/source_impl.cpp @@ -146,6 +146,19 @@ void Source::Impl::updateTiles(const UpdateParameters& parameters) { cache.setSize(conservativeCacheSize); } + removeStaleTiles(retain); + + const PlacementConfig config { parameters.transformState.getAngle(), + parameters.transformState.getPitch(), + parameters.debugOptions & MapDebugOptions::Collision }; + + for (auto& pair : tiles) { + pair.second->setPlacementConfig(config); + } +} + +// Moves all tiles to the cache except for those specified in the retain set. +void Source::Impl::removeStaleTiles(const std::set& retain) { // Remove stale tiles. This goes through the (sorted!) tiles map and retain set in lockstep // and removes items from tiles that don't have the corresponding key in the retain set. auto tilesIt = tiles.begin(); @@ -162,13 +175,12 @@ void Source::Impl::updateTiles(const UpdateParameters& parameters) { ++retainIt; } } +} - const PlacementConfig config { parameters.transformState.getAngle(), - parameters.transformState.getPitch(), - parameters.debugOptions & MapDebugOptions::Collision }; - - for (auto& pair : tiles) { - pair.second->setPlacementConfig(config); +void Source::Impl::removeTiles() { + renderTiles.clear(); + if (!tiles.empty()) { + removeStaleTiles({}); } } diff --git a/src/mbgl/style/source_impl.hpp b/src/mbgl/style/source_impl.hpp index 14ed9cd01c..9efe5205b3 100644 --- a/src/mbgl/style/source_impl.hpp +++ b/src/mbgl/style/source_impl.hpp @@ -48,6 +48,9 @@ public: // re-placement of existing complete tiles. void updateTiles(const UpdateParameters&); + // Removes all tiles (by putting them into the cache). + void removeTiles(); + // Request that all loaded tiles re-run the layout operation on the existing source // data with fresh style information. void reloadTiles(); @@ -82,6 +85,7 @@ public: protected: void invalidateTiles(); + void removeStaleTiles(const std::set&); Source& base; SourceObserver* observer = nullptr; diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index 0605a66d80..cec922f45e 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -254,6 +254,8 @@ void Style::cascade(const TimePoint& timePoint, MapMode mode) { } void Style::recalculate(float z, const TimePoint& timePoint, MapMode mode) { + // Disable all sources first. If we find an enabled layer that uses this source, we will + // re-enable it later. for (const auto& source : sources) { source->baseImpl->enabled = false; } @@ -287,6 +289,13 @@ void Style::recalculate(float z, const TimePoint& timePoint, MapMode mode) { } } } + + // Remove the existing tiles if we didn't end up re-enabling the source. + for (const auto& source : sources) { + if (!source->baseImpl->enabled) { + source->baseImpl->removeTiles(); + } + } } Source* Style::getSource(const std::string& id) const { -- cgit v1.2.1