[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:
@@ -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({});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user