diff --git a/android/cpp/native_map_view.cpp b/android/cpp/native_map_view.cpp index 0cb68408a..2d2a3b6cf 100644 --- a/android/cpp/native_map_view.cpp +++ b/android/cpp/native_map_view.cpp @@ -712,7 +712,6 @@ void NativeMapView::onInvalidate() { map.setSourceTileCacheSize(cacheSize); map.renderSync(); - map.nudgeTransitions(); } } diff --git a/include/mbgl/map/map.hpp b/include/mbgl/map/map.hpp index bd8847d42..af69ceffe 100644 --- a/include/mbgl/map/map.hpp +++ b/include/mbgl/map/map.hpp @@ -69,9 +69,6 @@ public: // Triggers a synchronous render. void renderSync(); - // Nudges transitions one step, possibly notifying of the need for a rerender, if any. - void nudgeTransitions(); - // Notifies the Map thread that the state has changed and an update might be necessary. void update(Update update); diff --git a/platform/default/glfw_view.cpp b/platform/default/glfw_view.cpp index 19f337994..74fee8c7d 100644 --- a/platform/default/glfw_view.cpp +++ b/platform/default/glfw_view.cpp @@ -352,7 +352,6 @@ void GLFWView::run() { if (benchmark) { map->setNeedsRepaint(); } - map->nudgeTransitions(); } } } diff --git a/platform/ios/MGLMapView.mm b/platform/ios/MGLMapView.mm index 4b9f30e29..ba1b58ba8 100644 --- a/platform/ios/MGLMapView.mm +++ b/platform/ios/MGLMapView.mm @@ -724,8 +724,6 @@ std::chrono::steady_clock::duration secondsAsDuration(float duration) _mbglMap->renderSync(); [self updateUserLocationAnnotationView]; - - _mbglMap->nudgeTransitions(); } } diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index 065c33ce5..c09d92712 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -55,6 +55,7 @@ void Map::renderSync() { view.notifyMapChange(MapChangeWillStartRenderingFrame); + const Update flags = transform->updateTransitions(Clock::now()); const bool fullyLoaded = context->invokeSync( &MapContext::renderSync, transform->getState(), FrameData { view.getFramebufferSize() }); @@ -68,14 +69,12 @@ void Map::renderSync() { renderState = RenderState::fully; view.notifyMapChange(MapChangeDidFinishRenderingMapFullyRendered); } -} -void Map::nudgeTransitions() { - Update flags = transform->updateTransitions(Clock::now()); - if (data->getNeedsRepaint()) { - flags |= Update::Repaint; + // Triggers an asynchronous update, that eventually triggers a view + // invalidation, causing renderSync to be called again if in transition. + if (transform->inTransition()) { + update(flags); } - update(flags); } void Map::update(Update flags) { diff --git a/src/mbgl/map/map_context.cpp b/src/mbgl/map/map_context.cpp index bdbf1ff0b..ce2fdcd79 100644 --- a/src/mbgl/map/map_context.cpp +++ b/src/mbgl/map/map_context.cpp @@ -256,6 +256,8 @@ void MapContext::update() { if (!style) { updateFlags = Update::Nothing; + } else if (data.getNeedsRepaint()) { + updateFlags |= Update::Repaint; } if (updateFlags == Update::Nothing || (data.mode == MapMode::Still && !callback)) { @@ -347,7 +349,12 @@ bool MapContext::renderSync(const TransformState& state, const FrameData& frame) view.afterRender(); - data.setNeedsRepaint(style->hasTransitions() || painter->needsAnimation()); + if (style->hasTransitions() || painter->needsAnimation()) { + data.setNeedsRepaint(true); + asyncUpdate->send(); + } else { + data.setNeedsRepaint(false); + } return isLoaded(); } diff --git a/src/mbgl/map/transform.cpp b/src/mbgl/map/transform.cpp index 7ccc2ad4c..60c55c3f0 100644 --- a/src/mbgl/map/transform.cpp +++ b/src/mbgl/map/transform.cpp @@ -386,6 +386,10 @@ void Transform::startTransition(std::function frame, transitionFinishFn = finish; } +bool Transform::inTransition() const { + return transitionFrameFn != nullptr; +} + Update Transform::updateTransitions(const TimePoint& now) { return transitionFrameFn ? transitionFrameFn(now) : Update::Nothing; } diff --git a/src/mbgl/map/transform.hpp b/src/mbgl/map/transform.hpp index 5d5a72d6d..167198344 100644 --- a/src/mbgl/map/transform.hpp +++ b/src/mbgl/map/transform.hpp @@ -46,6 +46,7 @@ public: double getPitch() const; // Transitions + bool inTransition() const; Update updateTransitions(const TimePoint& now); void cancelTransitions();