From 599ccea4a00d4e3b90e8a8eec96fb8e9cba5b64e Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Thu, 25 Feb 2016 13:50:00 +0300 Subject: [PATCH] Optimized render bucket deletion --- drape_frontend/frontend_renderer.cpp | 14 ++++++++++++-- drape_frontend/frontend_renderer.hpp | 1 + drape_frontend/render_group.cpp | 5 ++++- drape_frontend/render_group.hpp | 4 +++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 7412c87097..5849018998 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -862,7 +862,8 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView) for (RenderLayer & layer : m_layers) { for (auto & group : layer.m_renderGroups) - layer.m_isDirty |= group->UpdateFeaturesWaitingStatus(isFeaturesWaiting, m_currentZoomLevel, make_ref(m_overlayTree)); + layer.m_isDirty |= group->UpdateFeaturesWaitingStatus(isFeaturesWaiting, m_currentZoomLevel, + make_ref(m_overlayTree), m_bucketsToDelete); } bool const isPerspective = modelView.isPerspective(); @@ -970,6 +971,15 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView) #endif MergeBuckets(); + + size_t const kMinDeletedPerFrame = 10; + size_t const kAvgDeletionFrameCount = 30; + size_t countToDelete = max(kMinDeletedPerFrame, m_bucketsToDelete.size() / kAvgDeletionFrameCount); + while (!m_bucketsToDelete.empty() && countToDelete > 0) + { + m_bucketsToDelete.pop_front(); + countToDelete--; + } } void FrontendRenderer::Render2dLayer(ScreenBase const & modelView) @@ -1382,7 +1392,7 @@ void FrontendRenderer::Routine::Do() m_renderer.PrepareScene(modelView); // Check for a frame is active. - bool isActiveFrame = modelViewChanged || viewportChanged; + bool isActiveFrame = modelViewChanged || viewportChanged || !m_renderer.m_bucketsToDelete.empty(); isActiveFrame |= m_renderer.m_texMng->UpdateDynamicTextures(); m_renderer.RenderScene(modelView); diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index aabfb46d5f..1f565a964b 100755 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -250,6 +250,7 @@ private: array m_layers; vector> m_userMarkRenderGroups; set m_userMarkVisibility; + deque> m_bucketsToDelete; drape_ptr m_guiRenderer; drape_ptr m_myPositionController; diff --git a/drape_frontend/render_group.cpp b/drape_frontend/render_group.cpp index c9f91dcee4..c7167352d0 100755 --- a/drape_frontend/render_group.cpp +++ b/drape_frontend/render_group.cpp @@ -139,7 +139,9 @@ bool RenderGroup::IsLess(RenderGroup const & other) const return m_state < other.m_state; } -bool RenderGroup::UpdateFeaturesWaitingStatus(TCheckFeaturesWaiting isFeaturesWaiting, int currentZoom, ref_ptr tree) +bool RenderGroup::UpdateFeaturesWaitingStatus(TCheckFeaturesWaiting isFeaturesWaiting, + int currentZoom, ref_ptr tree, + deque> & bucketsToDelete) { if (!m_sharedFeaturesWaiting) return false; @@ -156,6 +158,7 @@ bool RenderGroup::UpdateFeaturesWaitingStatus(TCheckFeaturesWaiting isFeaturesWa { m_renderBuckets[i]->RemoveOverlayHandles(tree); swap(m_renderBuckets[i], m_renderBuckets.back()); + bucketsToDelete.push_back(move(m_renderBuckets.back())); m_renderBuckets.pop_back(); } else diff --git a/drape_frontend/render_group.hpp b/drape_frontend/render_group.hpp index bff45dcc25..94ca0ff886 100755 --- a/drape_frontend/render_group.hpp +++ b/drape_frontend/render_group.hpp @@ -79,7 +79,9 @@ public: } using TCheckFeaturesWaiting = function; - bool UpdateFeaturesWaitingStatus(TCheckFeaturesWaiting isFeaturesWaiting, int currentZoom, ref_ptr tree); + bool UpdateFeaturesWaitingStatus(TCheckFeaturesWaiting isFeaturesWaiting, + int currentZoom, ref_ptr tree, + deque> & bucketsToDelete); bool IsLess(RenderGroup const & other) const;