diff --git a/drape/render_bucket.cpp b/drape/render_bucket.cpp index cbd7487570..7725931beb 100644 --- a/drape/render_bucket.cpp +++ b/drape/render_bucket.cpp @@ -120,6 +120,15 @@ void RenderBucket::EndFeatureRecord(bool featureCompleted) m_featureInfo = FeatureGeometryId(); } +bool RenderBucket::IsFeaturesWaiting(TCheckFeaturesWaiting isFeaturesWaiting) +{ + ASSERT(!m_featuresRanges.empty(), ()); + for (auto const & featureRange : m_featuresRanges) + if (isFeaturesWaiting(featureRange.second.m_limitRect)) + return true; + return false; +} + void RenderBucket::RenderDebug(ScreenBase const & screen) const { #ifdef RENDER_DEBUG_RECTS diff --git a/drape/render_bucket.hpp b/drape/render_bucket.hpp index 5412989bb3..bc50ee6da1 100644 --- a/drape/render_bucket.hpp +++ b/drape/render_bucket.hpp @@ -53,13 +53,7 @@ public: void EndFeatureRecord(bool featureCompleted); using TCheckFeaturesWaiting = function; - bool IsFeaturesWaiting(TCheckFeaturesWaiting isFeaturesWaiting) - { - for (auto const & featureRange : m_featuresRanges) - if (isFeaturesWaiting(featureRange.second.m_limitRect)) - return true; - return false; - } + bool IsFeaturesWaiting(TCheckFeaturesWaiting isFeaturesWaiting); private: struct FeatureGeometryInfo diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index 9b769b7795..8c386b67a1 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -153,14 +153,16 @@ void BackendRenderer::AcceptMessage(ref_ptr message) case Message::FinishReading: { ref_ptr msg = message; - - TOverlaysRenderData overlays; - overlays.swap(m_overlays); - if (!overlays.empty()) + if (msg->IsEnableFlushOverlays()) { - m_commutator->PostMessage(ThreadsCommutator::RenderThread, - make_unique_dp(move(overlays)), - MessagePriority::Normal); + TOverlaysRenderData overlays; + overlays.swap(m_overlays); + if (!overlays.empty()) + { + m_commutator->PostMessage(ThreadsCommutator::RenderThread, + make_unique_dp(move(overlays)), + MessagePriority::Normal); + } } m_commutator->PostMessage(ThreadsCommutator::RenderThread, diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 6e04e61f4a..fc71708bac 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -1476,7 +1476,7 @@ void FrontendRenderer::Routine::Do() if (activityTimer.ElapsedSeconds() > kMaxInactiveSeconds) { // Process a message or wait for a message. - m_renderer.ProcessSingleMessage(false); + m_renderer.ProcessSingleMessage(); activityTimer.Reset(); } else diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index 4827b81e18..336bef859f 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -91,9 +91,10 @@ private: class FinishReadingMessage : public Message { public: - template FinishReadingMessage(T && tiles, uint64_t tileRequestGeneration) + template FinishReadingMessage(T && tiles, uint64_t tileRequestGeneration, bool enableFlushOverlays = true) : m_tiles(forward(tiles)) , m_tileRequestGeneration(tileRequestGeneration) + , m_enableFlushOverlays(enableFlushOverlays) {} Type GetType() const override { return Message::FinishReading; } @@ -101,10 +102,12 @@ public: TTilesCollection const & GetTiles() const { return m_tiles; } TTilesCollection && MoveTiles() { return move(m_tiles); } uint64_t GetTileRequestGeneration() const { return m_tileRequestGeneration; } + bool IsEnableFlushOverlays() const { return m_enableFlushOverlays; } private: TTilesCollection m_tiles; uint64_t m_tileRequestGeneration; + bool m_enableFlushOverlays; }; class FlushRenderBucketMessage : public BaseTileMessage diff --git a/drape_frontend/overlay_batcher.cpp b/drape_frontend/overlay_batcher.cpp index c03cc06652..64f761bd97 100644 --- a/drape_frontend/overlay_batcher.cpp +++ b/drape_frontend/overlay_batcher.cpp @@ -26,7 +26,9 @@ OverlayBatcher::OverlayBatcher(TileKey const & key) void OverlayBatcher::Batch(drape_ptr const & shape, ref_ptr texMng) { + m_batcher.StartFeatureRecord(shape->GetFeatureInfo(), shape->GetFeatureLimitRect()); shape->Draw(make_ref(&m_batcher), texMng); + m_batcher.EndFeatureRecord(); } void OverlayBatcher::Finish(TOverlaysRenderData & data) diff --git a/drape_frontend/read_manager.cpp b/drape_frontend/read_manager.cpp index ff67ddb087..2bb92db4de 100755 --- a/drape_frontend/read_manager.cpp +++ b/drape_frontend/read_manager.cpp @@ -165,7 +165,8 @@ void ReadManager::UpdateCoverage(ScreenBase const & screen, bool is3dBuildings, if (prevTaskCount == 0 && rereadTiles.empty() && inputRects.empty()) { m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, - make_unique_dp(m_finishedTiles, m_tileRequestGeneration), + make_unique_dp(m_finishedTiles, m_tileRequestGeneration, + false /* enableFlushOverlays */), MessagePriority::Normal); m_finishedTiles.clear(); }