From d75fdcc121cafb8240fb5d19f1597a9f8902687b Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Wed, 27 May 2015 16:02:28 +0300 Subject: [PATCH] Added updating of overlay tree by timer --- drape_frontend/frontend_renderer.cpp | 45 ++++++++++++++++++++++++---- drape_frontend/frontend_renderer.hpp | 19 ++++++++---- 2 files changed, 53 insertions(+), 11 deletions(-) diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index c93ef3fc58..e22b7556c8 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -46,6 +46,9 @@ FrontendRenderer::FrontendRenderer(Params const & params) , m_userEventStream(params.m_isCountryLoadedFn) , m_modelViewChangedFn(params.m_modelViewChangedFn) , m_tileTree(new TileTree()) + , m_overlayTree(new dp::OverlayTree()) + , m_overlayTreeIsUpdating(true) + , m_overlayTreeTime(0) { #ifdef DRAW_INFO m_tpf = 0,0; @@ -315,7 +318,38 @@ void FrontendRenderer::OnCompassTapped() m_userEventStream.AddEvent(RotateEvent(0.0)); } -void FrontendRenderer::RenderScene(ScreenBase const & modelView) +void FrontendRenderer::BeginUpdateOverlayTree(ScreenBase const & modelView, double frameTime) +{ + double const updatePeriod = 0.2; + + m_overlayTreeTime += frameTime; + if (m_overlayTreeTime > updatePeriod) + { + m_overlayTreeTime = 0.0; + m_overlayTreeIsUpdating = true; + } + + if (m_overlayTreeIsUpdating) + m_overlayTree->StartOverlayPlacing(modelView); +} + +void FrontendRenderer::UpdateOverlayTree(ScreenBase const & modelView, drape_ptr & renderGroup) +{ + if (m_overlayTreeIsUpdating) + renderGroup->CollectOverlay(make_ref(m_overlayTree)); + else + renderGroup->Update(modelView); +} + +void FrontendRenderer::EndUpdateOverlayTree() +{ + if (m_overlayTreeIsUpdating) + m_overlayTree->EndOverlayPlacing(); + + m_overlayTreeIsUpdating = false; +} + +void FrontendRenderer::RenderScene(ScreenBase const & modelView, double frameTime) { #ifdef DRAW_INFO BeforeDrawFrame(); @@ -324,8 +358,7 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView) RenderGroupComparator comparator; sort(m_renderGroups.begin(), m_renderGroups.end(), bind(&RenderGroupComparator::operator (), &comparator, _1, _2)); - dp::OverlayTree overlayTree; - overlayTree.StartOverlayPlacing(modelView); + BeginUpdateOverlayTree(modelView, frameTime); size_t eraseCount = 0; for (size_t i = 0; i < m_renderGroups.size(); ++i) { @@ -343,7 +376,7 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView) switch (group->GetState().GetDepthLayer()) { case dp::GLState::OverlayLayer: - group->CollectOverlay(make_ref(&overlayTree)); + UpdateOverlayTree(modelView, group); break; case dp::GLState::DynamicGeometry: group->Update(modelView); @@ -352,7 +385,7 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView) break; } } - overlayTree.EndOverlayPlacing(); + EndUpdateOverlayTree(); m_renderGroups.resize(m_renderGroups.size() - eraseCount); m_viewport.Apply(); @@ -577,7 +610,7 @@ void FrontendRenderer::Routine::Do() { context->setDefaultFramebuffer(); m_renderer.m_texMng->UpdateDynamicTextures(); - m_renderer.RenderScene(modelView); + m_renderer.RenderScene(modelView, frameTime); bool const animActive = InterpolationHolder::Instance().Advance(frameTime); modelView = m_renderer.UpdateScene(viewChanged); diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index 04eac88b46..268dd10d6d 100755 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -34,7 +34,11 @@ #include "std/function.hpp" #include "std/map.hpp" -namespace dp { class RenderBucket; } +namespace dp +{ + class RenderBucket; + class OverlayTree; +} namespace df { @@ -102,7 +106,7 @@ protected: private: void OnResize(ScreenBase const & screen); - void RenderScene(ScreenBase const & modelView); + void RenderScene(ScreenBase const & modelView, double frameTime); void RefreshProjection(); void RefreshModelView(ScreenBase const & screen); ScreenBase const & UpdateScene(bool & modelViewChanged); @@ -124,7 +128,6 @@ private: void CorrectScalePoint(m2::PointD & pt1, m2::PointD & pt2) const override; void OnScaleEnded() override; -private: class Routine : public threads::IRoutine { public: @@ -139,7 +142,10 @@ private: void ReleaseResources(); -private: + void BeginUpdateOverlayTree(ScreenBase const & modelView, double frameTime); + void UpdateOverlayTree(ScreenBase const & modelView, drape_ptr & renderGroup); + void EndUpdateOverlayTree(); + void AddToRenderGroup(vector> & groups, dp::GLState const & state, drape_ptr && renderBucket, @@ -157,7 +163,6 @@ private: private: drape_ptr m_gpuProgramManager; -private: vector> m_renderGroups; vector> m_deferredRenderGroups; vector> m_userMarkRenderGroups; @@ -166,6 +171,10 @@ private: drape_ptr m_guiRenderer; drape_ptr m_myPositionController; + drape_ptr m_overlayTree; + bool m_overlayTreeIsUpdating; + double m_overlayTreeTime; + dp::UniformValuesStorage m_generalUniforms; Viewport m_viewport;