summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-12-10 17:17:04 +0200
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2020-01-08 12:43:26 +0200
commitc25fbe9a94c30be75674772480aab86227521737 (patch)
tree9a6a609c86907caca05221d19d17e1f5fcc95a7d
parent2040d4d6f56ccb6b626af078fe752e1459565c6b (diff)
downloadqtlocation-mapboxgl-c25fbe9a94c30be75674772480aab86227521737.tar.gz
[core] Performance fix for placement in tile mode
-rw-r--r--src/mbgl/text/placement.cpp12
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) {