summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2016-12-23 15:33:38 +0100
committerKonstantin Käfer <mail@kkaefer.com>2016-12-23 17:25:03 +0100
commit2596534b901089ba5a59617015a65ebd0deb6bfd (patch)
tree9193825f8840236a18fd9ea29667d5ff861b4f68
parent083cee8956e6aa89eefe93df6e5c286a1b6728b8 (diff)
downloadqtlocation-mapboxgl-2596534b901089ba5a59617015a65ebd0deb6bfd.tar.gz
[build] move transition updates away from render call
-rw-r--r--src/mbgl/map/map.cpp27
1 files changed, 15 insertions, 12 deletions
diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp
index d76044cd47..e6282ae107 100644
--- a/src/mbgl/map/map.cpp
+++ b/src/mbgl/map/map.cpp
@@ -200,8 +200,6 @@ void Map::render(View& view) {
impl->backend.notifyMapChange(MapChangeWillStartRenderingFrame);
- const Update flags = impl->transform.updateTransitions(Clock::now());
-
impl->render(view);
impl->backend.notifyMapChange(isFullyLoaded() ?
@@ -218,12 +216,6 @@ void Map::render(View& view) {
impl->backend.notifyMapChange(MapChangeDidFinishLoadingMap);
}
}
-
- // Triggers an asynchronous update, that eventually triggers a view
- // invalidation, causing renderSync to be called again if in transition.
- if (flags != Update::Nothing) {
- impl->onUpdate(flags);
- }
}
void Map::triggerRepaint() {
@@ -235,15 +227,18 @@ void Map::Impl::update() {
updateFlags = Update::Nothing;
}
- if (updateFlags == Update::Nothing || (mode == MapMode::Still && !stillImageRequest)) {
- return;
- }
-
// This time point is used to:
// - Calculate style property transitions;
// - Hint style sources to notify when all its tiles are loaded;
timePoint = Clock::now();
+ const auto newFlags = transform.updateTransitions(timePoint);
+ updateFlags |= newFlags;
+
+ if (updateFlags == Update::Nothing || (mode == MapMode::Still && !stillImageRequest)) {
+ return;
+ }
+
if (style->loaded && updateFlags & Update::AnnotationStyle) {
annotationManager->updateStyle(*style);
updateFlags |= Update::Classes;
@@ -285,6 +280,14 @@ void Map::Impl::update() {
}
updateFlags = Update::Nothing;
+
+ // When no transition is in progress, updateTransitions returns Nothing, which means we don't
+ // have to trigger a subsequent update. When a current transition is in progress, it'll return
+ // UpdateStyle (when zoom levels change) or Repaint (when only lat/lon changes). In both cases,
+ // we'll have to render a new frame immediately.
+ if (newFlags != Update::Nothing) {
+ onUpdate(newFlags);
+ }
}
void Map::Impl::render(View& view) {