diff --git a/src/mbgl/map/map_context.cpp b/src/mbgl/map/map_context.cpp index c5a0ee07a..4f8052f29 100644 --- a/src/mbgl/map/map_context.cpp +++ b/src/mbgl/map/map_context.cpp @@ -35,7 +35,8 @@ MapContext::MapContext(View& view_, FileSource& fileSource, MapData& data_) data(data_), updated(static_cast(Update::Nothing)), asyncUpdate(std::make_unique(util::RunLoop::getLoop(), [this] { update(); })), - texturePool(std::make_unique()) { + texturePool(std::make_unique()), + viewInvalidated(false) { assert(util::ThreadContext::currentlyOn(util::ThreadType::Map)); util::ThreadContext::setFileSource(&fileSource); @@ -272,8 +273,8 @@ void MapContext::update() { style->update(transformState, *texturePool); if (data.mode == MapMode::Continuous) { - view.invalidate(); - } else if (callback && style->isLoaded()) { + invalidateView(); + } else if (callback && isLoaded()) { renderSync(transformState, frameData); } @@ -342,8 +343,10 @@ MapContext::RenderResult MapContext::renderSync(const TransformState& state, con view.swap(); + viewInvalidated = false; + return RenderResult { - style->isLoaded(), + isLoaded(), style->hasTransitions() || painter->needsAnimation() }; } @@ -370,7 +373,7 @@ void MapContext::setSourceTileCacheSize(size_t size) { for (const auto &source : style->sources) { source->setCacheSize(sourceCacheSize); } - view.invalidate(); + invalidateView(); } } @@ -380,7 +383,7 @@ void MapContext::onLowMemory() { for (const auto &source : style->sources) { source->onLowMemory(); } - view.invalidate(); + invalidateView(); } void MapContext::setSprite(const std::string& name, std::shared_ptr sprite) { @@ -410,4 +413,11 @@ void MapContext::onResourceLoadingFailed(std::exception_ptr error) { } } +void MapContext::invalidateView() { + if (!viewInvalidated) { + viewInvalidated = true; + view.invalidate(); + } +} + } diff --git a/src/mbgl/map/map_context.hpp b/src/mbgl/map/map_context.hpp index 764bf08b1..dd211d4a1 100644 --- a/src/mbgl/map/map_context.hpp +++ b/src/mbgl/map/map_context.hpp @@ -77,6 +77,8 @@ private: // Loads the actual JSON object an creates a new Style object. void loadStyleJSON(const std::string& json, const std::string& base); + void invalidateView(); + View& view; MapData& data; @@ -98,6 +100,7 @@ private: size_t sourceCacheSize; TransformState transformState; FrameData frameData; + bool viewInvalidated; }; }