From f06eb0a6cfc1ff746959ce864aa5a35a5e080c92 Mon Sep 17 00:00:00 2001 From: Chris Loer Date: Fri, 19 Jan 2018 11:38:31 -0800 Subject: Prune unused layers from CrossTileSymbolIndex Fixes issue #10939 -- removed layers would leak entries in the CrossTileSymbolIndex. --- src/mbgl/renderer/renderer_impl.cpp | 3 +++ src/mbgl/text/cross_tile_symbol_index.cpp | 12 ++++++++++++ src/mbgl/text/cross_tile_symbol_index.hpp | 1 + 3 files changed, 16 insertions(+) diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 8e5968d4c2..c38f1d56cb 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -382,8 +382,10 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { bool placementChanged = false; if (!placement->stillRecent(parameters.timePoint)) { auto newPlacement = std::make_unique(parameters.state, parameters.mapMode); + std::set usedSymbolLayers; for (auto it = order.rbegin(); it != order.rend(); ++it) { if (it->layer.is()) { + usedSymbolLayers.insert(it->layer.getID()); newPlacement->placeLayer(*it->layer.as(), 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); } diff --git a/src/mbgl/text/cross_tile_symbol_index.cpp b/src/mbgl/text/cross_tile_symbol_index.cpp index 8f4956c4ea..f88bab9d6f 100644 --- a/src/mbgl/text/cross_tile_symbol_index.cpp +++ b/src/mbgl/text/cross_tile_symbol_index.cpp @@ -169,6 +169,18 @@ bool CrossTileSymbolIndex::addLayer(RenderSymbolLayer& symbolLayer) { return symbolBucketsChanged; } +void CrossTileSymbolIndex::pruneUnusedLayers(const std::set& usedLayers) { + std::vector 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(); } diff --git a/src/mbgl/text/cross_tile_symbol_index.hpp b/src/mbgl/text/cross_tile_symbol_index.hpp index 5abcde241c..541c2e3661 100644 --- a/src/mbgl/text/cross_tile_symbol_index.hpp +++ b/src/mbgl/text/cross_tile_symbol_index.hpp @@ -57,6 +57,7 @@ public: CrossTileSymbolIndex(); bool addLayer(RenderSymbolLayer&); + void pruneUnusedLayers(const std::set&); void reset(); private: -- cgit v1.2.1