diff --git a/drape/fribidi.cpp b/drape/fribidi.cpp index fdb604ee18..429a47ac77 100644 --- a/drape/fribidi.cpp +++ b/drape/fribidi.cpp @@ -2,11 +2,16 @@ #include "3party/fribidi/lib/fribidi.h" +#include "std/mutex.hpp" + namespace fribidi { strings::UniString log2vis(strings::UniString const & str) { + static mutex fribidiMutex; + lock_guard lock(fribidiMutex); + size_t const count = str.size(); if (count == 0) return str; diff --git a/drape_frontend/drape_engine.cpp b/drape_frontend/drape_engine.cpp index 438bec208f..661a8fc2c4 100644 --- a/drape_frontend/drape_engine.cpp +++ b/drape_frontend/drape_engine.cpp @@ -68,9 +68,7 @@ void DrapeEngine::Resize(int w, int h) void DrapeEngine::UpdateCoverage(ScreenBase const & screen) { - m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread, - dp::MovePointer(new UpdateModelViewMessage(screen)), - MessagePriority::Normal); + m_frontend->UpdateModelView(screen); } void DrapeEngine::ClearUserMarksLayer(df::TileKey const & tileKey) diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index aaf04967de..e4124ff7a9 100644 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -40,6 +40,7 @@ FrontendRenderer::FrontendRenderer(dp::RefPointer commutator, , m_textureManager(textureManager) , m_gpuProgramManager(new dp::GpuProgramManager()) , m_viewport(viewport) + , m_modelViewChanged(false) { #ifdef DRAW_INFO m_tpf = 0,0; @@ -159,18 +160,6 @@ void FrontendRenderer::AcceptMessage(dp::RefPointer message) break; } - case Message::UpdateModelView: - { - UpdateModelViewMessage * coverMessage = df::CastMessage(message); - m_view = coverMessage->GetScreen(); - RefreshModelView(); - ResolveTileKeys(); - m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, - dp::MovePointer(new UpdateReadManagerMessage(m_view, m_tiles)), - MessagePriority::Normal); - break; - } - case Message::InvalidateRect: { InvalidateRectMessage * m = df::CastMessage(message); @@ -431,6 +420,7 @@ void FrontendRenderer::Routine::Do() context->setDefaultFramebuffer(); m_renderer.m_textureManager->UpdateDynamicTextures(); m_renderer.RenderScene(); + m_renderer.ProcessModelViewUpdating(); double availableTime = VSyncInterval - (timer.ElapsedSeconds() /*+ avarageMessageTime*/); @@ -467,4 +457,26 @@ void FrontendRenderer::DeleteRenderData() DeleteRange(m_userMarkRenderGroups, DeleteFunctor()); } +void FrontendRenderer::UpdateModelView(ScreenBase const & screen) +{ + lock_guard lock(m_modelViewMutex); + m_modelViewChanged = true; + m_newView = screen; +} + +void FrontendRenderer::ProcessModelViewUpdating() +{ + if (m_modelViewChanged) + { + lock_guard lock(m_modelViewMutex); + m_view = m_newView; + RefreshModelView(); + ResolveTileKeys(); + m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, + dp::MovePointer(new UpdateReadManagerMessage(m_view, m_tiles)), + MessagePriority::Normal); + m_modelViewChanged = false; + } +} + } // namespace df diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index 1c618db003..aa98382804 100644 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -55,6 +55,8 @@ public: void AfterDrawFrame(); #endif + void UpdateModelView(ScreenBase const & screen); + protected: virtual void AcceptMessage(dp::RefPointer message); @@ -90,6 +92,7 @@ private: private: void DeleteRenderData(); + void ProcessModelViewUpdating(); private: dp::RefPointer m_textureManager; @@ -107,6 +110,10 @@ private: ScreenBase m_view; set m_tiles; + ScreenBase m_newView; + mutex m_modelViewMutex; + bool m_modelViewChanged; + dp::OverlayTree m_overlayTree; }; diff --git a/drape_frontend/message.hpp b/drape_frontend/message.hpp index b4e8c20d66..0fddf671d3 100644 --- a/drape_frontend/message.hpp +++ b/drape_frontend/message.hpp @@ -13,7 +13,6 @@ public: TileReadEnded, FlushTile, MapShapeReaded, - UpdateModelView, UpdateReadManager, InvalidateRect, InvalidateReadManagerRect, diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index a754ca2c74..147d8e03aa 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -89,20 +89,6 @@ private: Viewport m_viewport; }; -class UpdateModelViewMessage : public Message -{ -public: - UpdateModelViewMessage(ScreenBase const & screen) - : m_screen(screen) {} - - Type GetType() const override { return Message::UpdateModelView; } - - ScreenBase const & GetScreen() const { return m_screen; } - -private: - ScreenBase m_screen; -}; - class InvalidateRectMessage : public Message { public: @@ -117,19 +103,22 @@ private: m2::RectD m_rect; }; -class UpdateReadManagerMessage : public UpdateModelViewMessage +class UpdateReadManagerMessage : public Message { public: UpdateReadManagerMessage(ScreenBase const & screen, set const & tiles) - : UpdateModelViewMessage(screen) - , m_tiles(tiles) {} + : m_screen(screen) + , m_tiles(tiles) + {} Type GetType() const override { return Message::UpdateReadManager; } set const & GetTiles() const { return m_tiles; } + ScreenBase const & GetScreen() const { return m_screen; } private: set m_tiles; + ScreenBase m_screen; }; class InvalidateReadManagerRectMessage : public Message