Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
[core] Decouple style change and transitions update
Browse files Browse the repository at this point in the history
Update transitions in a separate call chain in order to avoid
infinite loop, in case map is modified from within the
transitions update callback.
  • Loading branch information
pozdnyakov committed Oct 22, 2019
1 parent 0ca96fd commit 148cfe9
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 13 deletions.
33 changes: 20 additions & 13 deletions src/mbgl/map/map_impl.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include <mbgl/actor/scheduler.hpp>
#include <mbgl/layermanager/layer_manager.hpp>
#include <mbgl/map/map_impl.hpp>
#include <mbgl/renderer/update_parameters.hpp>
Expand All @@ -11,15 +12,17 @@ Map::Impl::Impl(RendererFrontend& frontend_,
MapObserver& observer_,
std::shared_ptr<FileSource> fileSource_,
const MapOptions& mapOptions)
: observer(observer_),
rendererFrontend(frontend_),
transform(observer, mapOptions.constrainMode(), mapOptions.viewportMode()),
mode(mapOptions.mapMode()),
pixelRatio(mapOptions.pixelRatio()),
crossSourceCollisions(mapOptions.crossSourceCollisions()),
fileSource(std::move(fileSource_)),
style(std::make_unique<style::Style>(*fileSource, pixelRatio)),
annotationManager(*style) {
: observer(observer_),
rendererFrontend(frontend_),
transform(observer, mapOptions.constrainMode(), mapOptions.viewportMode()),
mode(mapOptions.mapMode()),
pixelRatio(mapOptions.pixelRatio()),
crossSourceCollisions(mapOptions.crossSourceCollisions()),
fileSource(std::move(fileSource_)),
style(std::make_unique<style::Style>(*fileSource, pixelRatio)),
annotationManager(*style),
mailbox(std::make_shared<Mailbox>(*Scheduler::GetCurrent())),
actor(*this, mailbox) {
transform.setNorthOrientation(mapOptions.northOrientation());
style->impl->setObserver(this);
rendererFrontend.setObserver(*this);
Expand All @@ -39,12 +42,16 @@ void Map::Impl::onSourceChanged(style::Source& source) {
}

void Map::Impl::onUpdate() {
// Don't load/render anything in still mode until explicitly requested.
if (mode != MapMode::Continuous && !stillImageRequest) {
return;
if (mode == MapMode::Continuous) {
actor.invoke(&Map::Impl::updateInternal, Clock::now());
} else if (stillImageRequest) {
updateInternal(Clock::time_point::max());
}
}

TimePoint timePoint = mode == MapMode::Continuous ? Clock::now() : Clock::time_point::max();
void Map::Impl::updateInternal(TimePoint timePoint) {
// Don't load/render anything in still mode until explicitly requested.
assert(mode == MapMode::Continuous || stillImageRequest);

transform.updateTransitions(timePoint);

Expand Down
6 changes: 6 additions & 0 deletions src/mbgl/map/map_impl.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once

#include <mbgl/actor/actor_ref.hpp>
#include <mbgl/annotation/annotation_manager.hpp>
#include <mbgl/map/map.hpp>
#include <mbgl/map/map_observer.hpp>
Expand Down Expand Up @@ -51,6 +52,9 @@ class Map::Impl : public style::Observer, public RendererObserver {
// Map
void jumpTo(const CameraOptions&);

// Internal
void updateInternal(TimePoint timePoint);

MapObserver& observer;
RendererFrontend& rendererFrontend;

Expand All @@ -74,6 +78,8 @@ class Map::Impl : public style::Observer, public RendererObserver {
bool loading = false;
bool rendererFullyLoaded;
std::unique_ptr<StillImageRequest> stillImageRequest;
std::shared_ptr<Mailbox> mailbox;
ActorRef<Map::Impl> actor;
};

} // namespace mbgl

0 comments on commit 148cfe9

Please sign in to comment.