diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index aaad0d2e0d..2e8d51b273 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -112,7 +112,10 @@ void BackendRenderer::AcceptMessage(ref_ptr message) case Message::InvalidateReadManagerRect: { ref_ptr msg = message; - m_readManager->Invalidate(msg->GetTilesForInvalidate()); + if (msg->NeedInvalidateAll()) + m_readManager->InvalidateAll(); + else + m_readManager->Invalidate(msg->GetTilesForInvalidate()); break; } case Message::CountryStatusRecache: diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index a3e4eee4ce..ac19ec4348 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -434,11 +434,6 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) // Clear tile tree. m_tileTree->Invalidate(); - // Get new tiles. - TTilesCollection tiles; - ScreenBase screen = m_userEventStream.GetCurrentScreen(); - ResolveTileKeys(screen.ClipRect(), tiles); - // Clear all graphics. m_renderGroups.clear(); m_deferredRenderGroups.clear(); @@ -447,7 +442,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) { BaseBlockingMessage::Blocker blocker; m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, - make_unique_dp(blocker, tiles), + make_unique_dp(blocker), MessagePriority::High); blocker.Wait(); } @@ -491,6 +486,10 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) } // Request new tiles. + TTilesCollection tiles; + ScreenBase screen = m_userEventStream.GetCurrentScreen(); + ResolveTileKeys(screen.ClipRect(), tiles); + m_requestedTiles->Set(screen, m_isIsometry || screen.isPerspective(), move(tiles)); m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, make_unique_dp(), diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index bfd1dbcab3..e80cc970a4 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -167,14 +167,23 @@ public: InvalidateReadManagerRectMessage(Blocker & blocker, TTilesCollection const & tiles) : BaseBlockingMessage(blocker) , m_tiles(tiles) + , m_needInvalidateAll(false) + {} + + InvalidateReadManagerRectMessage(Blocker & blocker) + : BaseBlockingMessage(blocker) + , m_needInvalidateAll(true) {} Type GetType() const override { return Message::InvalidateReadManagerRect; } TTilesCollection const & GetTilesForInvalidate() const { return m_tiles; } + bool NeedInvalidateAll() const { return m_needInvalidateAll; } + private: TTilesCollection m_tiles; + bool m_needInvalidateAll; }; class ClearUserMarkLayerMessage : public BaseTileMessage diff --git a/drape_frontend/read_manager.cpp b/drape_frontend/read_manager.cpp index e7445d3be0..4fc0bcd60e 100755 --- a/drape_frontend/read_manager.cpp +++ b/drape_frontend/read_manager.cpp @@ -155,6 +155,17 @@ void ReadManager::Invalidate(TTilesCollection const & keyStorage) m_forceUpdate = true; } +void ReadManager::InvalidateAll() +{ + for (auto const & info : m_tileInfos) + CancelTileInfo(info); + + m_tileInfos.clear(); + + m_forceUpdate = true; + m_modeChanged = true; +} + void ReadManager::Stop() { for_each(m_tileInfos.begin(), m_tileInfos.end(), bind(&ReadManager::CancelTileInfo, this, _1)); diff --git a/drape_frontend/read_manager.hpp b/drape_frontend/read_manager.hpp index 232b7d9c82..688f3b5891 100755 --- a/drape_frontend/read_manager.hpp +++ b/drape_frontend/read_manager.hpp @@ -33,6 +33,7 @@ public: void UpdateCoverage(ScreenBase const & screen, bool is3dBuildings, TTilesCollection const & tiles, ref_ptr texMng); void Invalidate(TTilesCollection const & keyStorage); + void InvalidateAll(); void Stop(); bool CheckTileKey(TileKey const & tileKey) const;