From 924bd6a17d19d031ce7f328fe1baf8f5a99c8fe8 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Fri, 20 Dec 2019 17:29:30 +0200 Subject: [PATCH 1/7] [core] Place already visible symbols first and hidden symbols last --- src/mbgl/text/placement.cpp | 27 ++++++++++++++++++++++++++- src/mbgl/text/placement.hpp | 3 +++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index d6d6e269bc6..f5e0be08294 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -662,7 +662,25 @@ void Placement::placeSymbolBucket(const BucketPlacementData& params, std::setgetSymbolPlacement(a); + auto* bPlacement = previousPlacement->getSymbolPlacement(b); + if (!aPlacement) { + // a < b, if 'a' is new and if 'b' was previously hidden. + return bPlacement && !bPlacement->placed(); + } + if (!bPlacement) { + // a < b, if 'b' is new and 'a' was previously shown. + return aPlacement && aPlacement->placed(); + } + // a < b, if 'a' was shown and 'b' was hidden. + return aPlacement->placed() && !bPlacement->placed(); + }); + } + for (const SymbolInstance& symbol : sortedSymbols) { placeSymbol(symbol); } } @@ -1203,6 +1221,13 @@ float Placement::zoomAdjustment(const float zoom) const { return std::max(0.0, (placementZoom - zoom) / 1.5); } +const JointPlacement* Placement::getSymbolPlacement(const SymbolInstance& symbol) const { + assert(symbol.crossTileID != 0); + auto found = placements.find(symbol.crossTileID); + if (found == placements.end()) return nullptr; + return &found->second; +} + Duration Placement::getUpdatePeriod(const float zoom) const { // Even if transitionOptions.duration is set to a value < 300ms, we still wait for this default transition duration // before attempting another placement operation. diff --git a/src/mbgl/text/placement.hpp b/src/mbgl/text/placement.hpp index df7345d4cca..b2ad5d62e0e 100644 --- a/src/mbgl/text/placement.hpp +++ b/src/mbgl/text/placement.hpp @@ -49,6 +49,8 @@ class JointPlacement { : text(text_), icon(icon_), skipFade(skipFade_) {} + bool placed() const { return text || icon; } + const bool text; const bool icon; // skipFade = outside viewport, but within CollisionIndex::viewportPadding px of the edge @@ -119,6 +121,7 @@ class Placement { Duration getUpdatePeriod(const float zoom) const; float zoomAdjustment(const float zoom) const; + const JointPlacement* getSymbolPlacement(const SymbolInstance&) const; const RetainedQueryData& getQueryData(uint32_t bucketInstanceId) const; From 2589fe8d7b9dfbf386190a35e7af9f0e5208b032 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Mon, 9 Mar 2020 16:34:18 +0200 Subject: [PATCH 2/7] [core] Do not squeeze placement period if the view is tilted If the view is not tilted, we want the new symbols to show up faster, so we squeeze the placement period. On contrary, with the tilted view it's more important to make placement rarely for performance reasons and as the new symbols are normally "far away" and the user is not that interested to see them ASAP. --- src/mbgl/renderer/render_orchestrator.cpp | 21 ++++++++++++++------- src/mbgl/text/placement.cpp | 8 ++------ src/mbgl/text/placement.hpp | 2 +- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index f00f9ee9be4..7fb6eff29cf 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -281,6 +281,7 @@ std::unique_ptr RenderOrchestrator::createRenderTree( renderSources.emplace(entry.first, std::move(renderSource)); } transformState = updateParameters->transformState; + const bool tiltedView = transformState.getPitch() != 0.0f; // Create parameters for the render tree. auto renderTreeParameters = std::make_unique(updateParameters->transformState, @@ -386,14 +387,20 @@ std::unique_ptr RenderOrchestrator::createRenderTree( symbolBucketsAdded = symbolBucketsAdded || (result & CrossTileSymbolIndex::AddLayerResult::BucketsAdded); symbolBucketsChanged = symbolBucketsChanged || (result != CrossTileSymbolIndex::AddLayerResult::NoChanges); } - // We want new symbols to show up faster, however simple setting `placementChanged` to `true` would - // initiate placement too often as new buckets ususally come from several rendered tiles in a row within - // a short period of time. Instead, we squeeze placement update period to coalesce buckets updates from several - // tiles. - optional maximumPlacementUpdatePeriod; - if (symbolBucketsAdded) maximumPlacementUpdatePeriod = optional(Milliseconds(30)); + + optional placementUpdatePeriodOverride; + if (symbolBucketsAdded && !tiltedView) { + // If the view is not tilted, we want *the new* symbols to show up faster, however simple setting + // `placementChanged` to `true` would initiate placement too often as new buckets usually come from several + // rendered tiles in a row within a short period of time. Instead, we squeeze placement update period to + // coalesce buckets updates from several tiles. On contrary, with the tilted view it's more important to + // make placement rarely for performance reasons and as the new symbols are normally "far away" and the user + // is not that interested to see them ASAP. + placementUpdatePeriodOverride = optional(Milliseconds(30)); + } + renderTreeParameters->placementChanged = !placementController.placementIsRecent( - updateParameters->timePoint, updateParameters->transformState.getZoom(), maximumPlacementUpdatePeriod); + updateParameters->timePoint, updateParameters->transformState.getZoom(), placementUpdatePeriodOverride); symbolBucketsChanged |= renderTreeParameters->placementChanged; std::set usedSymbolLayers; diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index f5e0be08294..d8cf4653c6d 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -68,14 +68,10 @@ void PlacementController::setPlacement(Immutable placement_) { stale = false; } -bool PlacementController::placementIsRecent(TimePoint now, const float zoom, optional maximumDuration) const { +bool PlacementController::placementIsRecent(TimePoint now, const float zoom, optional periodOverride) const { if (!placement->transitionsEnabled()) return false; - auto updatePeriod = placement->getUpdatePeriod(zoom); - - if (maximumDuration) { - updatePeriod = std::min(*maximumDuration, updatePeriod); - } + auto updatePeriod = periodOverride ? *periodOverride : placement->getUpdatePeriod(zoom); return placement->getCommitTime() + updatePeriod > now; } diff --git a/src/mbgl/text/placement.hpp b/src/mbgl/text/placement.hpp index b2ad5d62e0e..2ceb531d448 100644 --- a/src/mbgl/text/placement.hpp +++ b/src/mbgl/text/placement.hpp @@ -96,7 +96,7 @@ class PlacementController { void setPlacement(Immutable); const Immutable& getPlacement() const { return placement; } void setPlacementStale() { stale = true; } - bool placementIsRecent(TimePoint now, const float zoom, optional maximumDuration = nullopt) const; + bool placementIsRecent(TimePoint now, const float zoom, optional periodOverride = nullopt) const; bool hasTransitions(TimePoint now) const; private: From 77070109f3c97a91672c5a6e57ccf68ab1752185 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Mon, 9 Mar 2020 16:41:58 +0200 Subject: [PATCH 3/7] [core] Variable labels stick to latest anchor if the view is tilted This is done in order to improve labels stability and for the performace reasons. --- src/mbgl/text/placement.cpp | 50 +++++++++++++++++++++---------------- src/mbgl/text/placement.hpp | 1 + 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index d8cf4653c6d..4eaf08f34ad 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -311,12 +311,12 @@ void Placement::placeSymbolBucket(const BucketPlacementData& params, std::setsecond.anchor; auto found = std::find(variableTextAnchors.begin(), variableTextAnchors.end(), prevAnchor); if (found != variableTextAnchors.begin() && found != variableTextAnchors.end()) { - std::vector filtered; - filtered.reserve(variableTextAnchors.size()); - filtered.push_back(prevAnchor); - for (auto anchor : variableTextAnchors) { - if (anchor != prevAnchor) { - filtered.push_back(anchor); + std::vector filtered{prevAnchor}; + if (!isTiltedView()) { + for (auto anchor : variableTextAnchors) { + if (anchor != prevAnchor) { + filtered.push_back(anchor); + } } } variableTextAnchors = std::move(filtered); @@ -659,22 +659,24 @@ void Placement::placeSymbolBucket(const BucketPlacementData& params, std::setgetSymbolPlacement(a); - auto* bPlacement = previousPlacement->getSymbolPlacement(b); - if (!aPlacement) { - // a < b, if 'a' is new and if 'b' was previously hidden. - return bPlacement && !bPlacement->placed(); - } - if (!bPlacement) { - // a < b, if 'b' is new and 'a' was previously shown. - return aPlacement && aPlacement->placed(); - } - // a < b, if 'a' was shown and 'b' was hidden. - return aPlacement->placed() && !bPlacement->placed(); - }); + auto* previousPlacement = getPrevPlacement(); + if (previousPlacement && isTiltedView()) { + std::stable_sort(sortedSymbols.begin(), + sortedSymbols.end(), + [&previousPlacement](const SymbolInstance& a, const SymbolInstance& b) { + auto* aPlacement = previousPlacement->getSymbolPlacement(a); + auto* bPlacement = previousPlacement->getSymbolPlacement(b); + if (!aPlacement) { + // a < b, if 'a' is new and if 'b' was previously hidden. + return bPlacement && !bPlacement->placed(); + } + if (!bPlacement) { + // a < b, if 'b' is new and 'a' was previously shown. + return aPlacement && aPlacement->placed(); + } + // a < b, if 'a' was shown and 'b' was hidden. + return aPlacement->placed() && !bPlacement->placed(); + }); } for (const SymbolInstance& symbol : sortedSymbols) { placeSymbol(symbol); @@ -1201,6 +1203,10 @@ void Placement::markUsedOrientation(SymbolBucket& bucket, } } +bool Placement::isTiltedView() const { + return updateParameters->transformState.getPitch() != 0.0f; +} + float Placement::symbolFadeChange(TimePoint now) const { if (transitionsEnabled() && transitionOptions.duration.value_or(util::DEFAULT_TRANSITION_DURATION) > Milliseconds(0)) { diff --git a/src/mbgl/text/placement.hpp b/src/mbgl/text/placement.hpp index 2ceb531d448..d3f92eb0682 100644 --- a/src/mbgl/text/placement.hpp +++ b/src/mbgl/text/placement.hpp @@ -137,6 +137,7 @@ class Placement { style::TextWritingModeType orientation) const; void markUsedOrientation(SymbolBucket&, style::TextWritingModeType, const SymbolInstance&) const; const Placement* getPrevPlacement() const { return prevPlacement ? prevPlacement->get() : nullptr; } + bool isTiltedView() const; std::shared_ptr updateParameters; CollisionIndex collisionIndex; From 12b17205308e8631d6c9465f9ee14e80b5891246 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Tue, 10 Mar 2020 23:05:47 +0200 Subject: [PATCH 4/7] [core] Collision index uses doubled padding with the tilted view --- .../viewport-overzoomed/expected.png | Bin 0 -> 23021 bytes .../text-pitch-scaling/line-half/expected.png | Bin 0 -> 46378 bytes src/mbgl/text/collision_index.cpp | 14 +++++++++++--- 3 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 metrics/expectations/platform-all/render-tests/text-pitch-alignment/viewport-overzoomed/expected.png create mode 100644 metrics/expectations/platform-all/render-tests/text-pitch-scaling/line-half/expected.png diff --git a/metrics/expectations/platform-all/render-tests/text-pitch-alignment/viewport-overzoomed/expected.png b/metrics/expectations/platform-all/render-tests/text-pitch-alignment/viewport-overzoomed/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..b996d264c4bf667212c1dcb3108568faee46b1a0 GIT binary patch literal 23021 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 Yq)jBcE*b Date: Thu, 12 Mar 2020 21:46:29 +0200 Subject: [PATCH 5/7] [core] Binary size fixup --- src/mbgl/text/placement.cpp | 84 ++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 38 deletions(-) diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index 4eaf08f34ad..fff11ab185e 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -592,7 +592,8 @@ void Placement::placeSymbolBucket(const BucketPlacementData& params, std::set shift) -> bool { + auto collisionBoxIntersectsTileEdges = [&](const CollisionBox& collisionBox, + Point shift) noexcept->bool { bool intersects = collisionIndex.intersectsTileEdges(collisionBox, shift, renderTile.matrix, pixelRatio, *tileBorders); // Check if this symbol intersects the neighbor tile borders. If so, it also shall be placed with priority. @@ -604,7 +605,14 @@ void Placement::placeSymbolBucket(const BucketPlacementData& params, std::set bool { + auto symbolIntersectsTileEdges = [ + &locationCache, + &collisionBoxIntersectsTileEdges, + variableAnchor, + pitchTextWithMap, + rotateTextWithMap, + bearing = state.getBearing() + ](const SymbolInstance& symbol) noexcept->bool { auto it = locationCache.find(symbol.crossTileID); if (it != locationCache.end()) return it->second; @@ -623,7 +631,7 @@ void Placement::placeSymbolBucket(const BucketPlacementData& params, std::setgetSymbolPlacement(a); - auto* bPlacement = previousPlacement->getSymbolPlacement(b); - if (!aPlacement) { - // a < b, if 'a' is new and if 'b' was previously hidden. - return bPlacement && !bPlacement->placed(); - } - if (!bPlacement) { - // a < b, if 'b' is new and 'a' was previously shown. - return aPlacement && aPlacement->placed(); - } - // a < b, if 'a' was shown and 'b' was hidden. - return aPlacement->placed() && !bPlacement->placed(); - }); + std::stable_sort( + sortedSymbols.begin(), + sortedSymbols.end(), + [previousPlacement](const SymbolInstance& a, const SymbolInstance& b) noexcept { + auto* aPlacement = previousPlacement->getSymbolPlacement(a); + auto* bPlacement = previousPlacement->getSymbolPlacement(b); + if (!aPlacement) { + // a < b, if 'a' is new and if 'b' was previously hidden. + return bPlacement && !bPlacement->placed(); + } + if (!bPlacement) { + // a < b, if 'b' is new and 'a' was previously shown. + return aPlacement && aPlacement->placed(); + } + // a < b, if 'a' was shown and 'b' was hidden. + return aPlacement->placed() && !bPlacement->placed(); + }); } for (const SymbolInstance& symbol : sortedSymbols) { placeSymbol(symbol); @@ -1226,8 +1235,7 @@ float Placement::zoomAdjustment(const float zoom) const { const JointPlacement* Placement::getSymbolPlacement(const SymbolInstance& symbol) const { assert(symbol.crossTileID != 0); auto found = placements.find(symbol.crossTileID); - if (found == placements.end()) return nullptr; - return &found->second; + return (found == placements.end()) ? &found->second : nullptr; } Duration Placement::getUpdatePeriod(const float zoom) const { From 5d70cde852ea3d965066ba3b7730364637334a4a Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Thu, 12 Mar 2020 22:46:35 +0200 Subject: [PATCH 6/7] Update metrics --- metrics/binary-size/android-arm64-v8a/metrics.json | 2 +- metrics/binary-size/android-armeabi-v7a/metrics.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/metrics/binary-size/android-arm64-v8a/metrics.json b/metrics/binary-size/android-arm64-v8a/metrics.json index c523910a2eb..262799af888 100644 --- a/metrics/binary-size/android-arm64-v8a/metrics.json +++ b/metrics/binary-size/android-arm64-v8a/metrics.json @@ -3,7 +3,7 @@ [ "android-arm64-v8a", "/tmp/attach/install/android-arm64-v8a-release/lib/libmapbox-gl.so", - 1952143 + 1972354 ] ] } \ No newline at end of file diff --git a/metrics/binary-size/android-armeabi-v7a/metrics.json b/metrics/binary-size/android-armeabi-v7a/metrics.json index b5691f1e7dd..5ef1944ca39 100644 --- a/metrics/binary-size/android-armeabi-v7a/metrics.json +++ b/metrics/binary-size/android-armeabi-v7a/metrics.json @@ -3,7 +3,7 @@ [ "android-armeabi-v7a", "/tmp/attach/install/android-armeabi-v7a-release/lib/libmapbox-gl.so", - 1647895 + 1664652 ] ] } \ No newline at end of file From 67ba54d606469b61019835f5e6169a56d3b421cc Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Wed, 11 Mar 2020 20:01:41 +0200 Subject: [PATCH 7/7] Add change log entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bc957c6616..ce1ff8a4d12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ New feature provides means of modifying style of a MapSnapshotter. The new API enables several use-cases, such as: adding route overlays, removing extra information (layers) from a base style, adding custom images that are missing from a style. +- [core] Improve stability of symbol placement when the map is tilted ([#16287](https://github.com/mapbox/mapbox-gl-native/pull/16287)) + + These changes improve performance and bring more stability to the symbol placement for the tilted view, which is mainly used for navigation scenarios. + ### 🐞 Bug fixes - [core] Fix iterators in addRegularDash() ([#16249](https://github.com/mapbox/mapbox-gl-native/pull/16249))