[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.
This commit is contained in:
Konstantin Käfer
2016-09-19 15:54:13 +02:00
parent 91272992f3
commit ef8017198c
3 changed files with 31 additions and 6 deletions

View File

@@ -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<OverscaledTileID>& 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({});
}
}

View File

@@ -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<OverscaledTileID>&);
Source& base;
SourceObserver* observer = nullptr;

View File

@@ -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 {