Prune unused layers from CrossTileSymbolIndex
Fixes issue #10939 -- removed layers would leak entries in the CrossTileSymbolIndex.
This commit is contained in:
@@ -382,8 +382,10 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
|
||||
bool placementChanged = false;
|
||||
if (!placement->stillRecent(parameters.timePoint)) {
|
||||
auto newPlacement = std::make_unique<Placement>(parameters.state, parameters.mapMode);
|
||||
std::set<std::string> usedSymbolLayers;
|
||||
for (auto it = order.rbegin(); it != order.rend(); ++it) {
|
||||
if (it->layer.is<RenderSymbolLayer>()) {
|
||||
usedSymbolLayers.insert(it->layer.getID());
|
||||
newPlacement->placeLayer(*it->layer.as<RenderSymbolLayer>(), parameters.projMatrix, parameters.debugOptions & MapDebugOptions::Collision);
|
||||
}
|
||||
}
|
||||
@@ -393,6 +395,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
|
||||
// started. If we violate this assumption, then we need to either make CollisionIndex completely independendent of
|
||||
// FeatureIndex, or find a way for its entries to point to multiple FeatureIndexes.
|
||||
commitFeatureIndexes();
|
||||
crossTileSymbolIndex.pruneUnusedLayers(usedSymbolLayers);
|
||||
if (placementChanged || symbolBucketsChanged) {
|
||||
placement = std::move(newPlacement);
|
||||
}
|
||||
|
||||
@@ -169,6 +169,18 @@ bool CrossTileSymbolIndex::addLayer(RenderSymbolLayer& symbolLayer) {
|
||||
return symbolBucketsChanged;
|
||||
}
|
||||
|
||||
void CrossTileSymbolIndex::pruneUnusedLayers(const std::set<std::string>& usedLayers) {
|
||||
std::vector<std::string> unusedLayers;
|
||||
for (auto layerIndex : layerIndexes) {
|
||||
if (usedLayers.find(layerIndex.first) == usedLayers.end()) {
|
||||
unusedLayers.push_back(layerIndex.first);
|
||||
}
|
||||
}
|
||||
for (auto unusedLayer : unusedLayers) {
|
||||
layerIndexes.erase(unusedLayer);
|
||||
}
|
||||
}
|
||||
|
||||
void CrossTileSymbolIndex::reset() {
|
||||
layerIndexes.clear();
|
||||
}
|
||||
|
||||
@@ -57,6 +57,7 @@ public:
|
||||
CrossTileSymbolIndex();
|
||||
|
||||
bool addLayer(RenderSymbolLayer&);
|
||||
void pruneUnusedLayers(const std::set<std::string>&);
|
||||
|
||||
void reset();
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user