diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-12-10 17:17:04 +0200 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2020-01-08 12:43:26 +0200 |
commit | c25fbe9a94c30be75674772480aab86227521737 (patch) | |
tree | 9a6a609c86907caca05221d19d17e1f5fcc95a7d /src/mbgl/text | |
parent | 2040d4d6f56ccb6b626af078fe752e1459565c6b (diff) | |
download | qtlocation-mapboxgl-c25fbe9a94c30be75674772480aab86227521737.tar.gz |
[core] Performance fix for placement in tile mode
Diffstat (limited to 'src/mbgl/text')
-rw-r--r-- | src/mbgl/text/placement.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index 32def0b611..62ac70a0d6 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -562,9 +562,15 @@ void Placement::placeBucket(const SymbolBucket& bucket, symbolInstances.end()); optional<style::TextVariableAnchorType> variableAnchor; if (!variableTextAnchors.empty()) variableAnchor = variableTextAnchors.front(); + std::unordered_map<uint32_t, bool> sortedCache; + sortedCache.reserve(sorted.size()); auto intersectsTileBorder = [&](const SymbolInstance& symbol) -> bool { - if (symbol.textCollisionFeature.boxes.empty()) return false; + if (symbol.textCollisionFeature.alongLine || symbol.textCollisionFeature.boxes.empty()) return false; + + auto it = sortedCache.find(symbol.crossTileID); + if (it != sortedCache.end()) return it->second; + Point<float> offset{}; if (variableAnchor) { const CollisionBox& textBox = symbol.textCollisionFeature.boxes.front(); @@ -579,8 +585,10 @@ void Placement::placeBucket(const SymbolBucket& bucket, pitchWithMap, state.getBearing()); } - return collisionIndex.featureIntersectsTileBorders( + bool result = collisionIndex.featureIntersectsTileBorders( symbol.textCollisionFeature, offset, posMatrix, pixelRatio, *tileBorders); + sortedCache.insert(std::make_pair(symbol.crossTileID, result)); + return result; }; std::stable_sort(sorted.begin(), sorted.end(), [&](const SymbolInstance& a, const SymbolInstance& b) { |