From 58b6c42f5d505204ea96faff812885f0d3723614 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Wed, 6 Jun 2018 22:52:00 -0400 Subject: [core] always commit placement to fix #11795 Since placements will be committed even if they do not need the full fade duration to fade features in, we need the new `fadeStartTime` to keep track of how long we still need to fade. This is important because if we fade too long we will trigger another placement and never stop rendering. --- src/mbgl/renderer/renderer_impl.cpp | 10 ++++------ src/mbgl/text/placement.cpp | 20 ++++++++------------ src/mbgl/text/placement.hpp | 4 ++-- 3 files changed, 14 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index ca9e809977..fea27403c9 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -387,6 +387,8 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { bool placementChanged = false; if (!placement->stillRecent(parameters.timePoint)) { + placementChanged = true; + auto newPlacement = std::make_unique(parameters.state, parameters.mapMode); std::set usedSymbolLayers; for (auto it = order.rbegin(); it != order.rend(); ++it) { @@ -396,13 +398,9 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { } } - placementChanged = newPlacement->commit(*placement, parameters.timePoint); + newPlacement->commit(*placement, parameters.timePoint); crossTileSymbolIndex.pruneUnusedLayers(usedSymbolLayers); - if (placementChanged || symbolBucketsChanged) { - placement = std::move(newPlacement); - } - - placement->setRecent(parameters.timePoint); + placement = std::move(newPlacement); updateFadingTiles(); } else { diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index 9883a1f456..33844e6427 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -38,7 +38,6 @@ Placement::Placement(const TransformState& state_, MapMode mapMode_) : collisionIndex(state_) , state(state_) , mapMode(mapMode_) - , recentUntil(TimePoint::min()) {} void Placement::placeLayer(RenderSymbolLayer& symbolLayer, const mat4& projMatrix, bool showCollisionBoxes) { @@ -188,7 +187,7 @@ void Placement::placeLayerBucket( bucket.justReloaded = false; } -bool Placement::commit(const Placement& prevPlacement, TimePoint now) { +void Placement::commit(const Placement& prevPlacement, TimePoint now) { commitTime = now; bool placementChanged = false; @@ -222,7 +221,7 @@ bool Placement::commit(const Placement& prevPlacement, TimePoint now) { } } - return placementChanged; + fadeStartTime = placementChanged ? commitTime : prevPlacement.fadeStartTime; } void Placement::updateLayerOpacities(RenderSymbolLayer& symbolLayer) { @@ -339,18 +338,15 @@ float Placement::symbolFadeChange(TimePoint now) const { } bool Placement::hasTransitions(TimePoint now) const { - return symbolFadeChange(now) < 1.0 || stale; + if (mapMode == MapMode::Continuous) { + return stale || std::chrono::duration(now - fadeStartTime) < Duration(std::chrono::milliseconds(300)); + } else { + return false; + } } bool Placement::stillRecent(TimePoint now) const { - return mapMode == MapMode::Continuous && recentUntil > now; -} -void Placement::setRecent(TimePoint now) { - stale = false; - if (mapMode == MapMode::Continuous) { - // Only set in continuous mode because "now" isn't defined in still mode - recentUntil = now + Duration(std::chrono::milliseconds(300)); - } + return mapMode == MapMode::Continuous && commitTime + Duration(std::chrono::milliseconds(300)) > now; } void Placement::setStale() { diff --git a/src/mbgl/text/placement.hpp b/src/mbgl/text/placement.hpp index 0e1751b127..24de4c054a 100644 --- a/src/mbgl/text/placement.hpp +++ b/src/mbgl/text/placement.hpp @@ -63,7 +63,7 @@ class Placement { public: Placement(const TransformState&, MapMode mapMode); void placeLayer(RenderSymbolLayer&, const mat4&, bool showCollisionBoxes); - bool commit(const Placement& prevPlacement, TimePoint); + void commit(const Placement& prevPlacement, TimePoint); void updateLayerOpacities(RenderSymbolLayer&); float symbolFadeChange(TimePoint now) const; bool hasTransitions(TimePoint now) const; @@ -94,12 +94,12 @@ private: TransformState state; MapMode mapMode; + TimePoint fadeStartTime; TimePoint commitTime; std::unordered_map placements; std::unordered_map opacities; - TimePoint recentUntil; bool stale = false; std::unordered_map retainedQueryData; -- cgit v1.2.1