From 6690e64305c001b46ee2c9bdfc44e16d0bbb30e6 Mon Sep 17 00:00:00 2001 From: "r.kuznetsov" Date: Tue, 15 Mar 2016 14:01:54 +0300 Subject: [PATCH] Refactoring after applying of geometry clipping --- drape_frontend/backend_renderer.cpp | 10 +++--- drape_frontend/frontend_renderer.cpp | 46 ++++++++++----------------- drape_frontend/frontend_renderer.hpp | 5 +-- drape_frontend/message_subclasses.hpp | 5 +-- drape_frontend/read_manager.cpp | 22 ++++++------- drape_frontend/read_manager.hpp | 7 ++-- drape_frontend/render_group.cpp | 4 +-- drape_frontend/render_group.hpp | 3 +- drape_frontend/requested_tiles.cpp | 13 +++----- drape_frontend/requested_tiles.hpp | 9 +++--- drape_frontend/user_event_stream.cpp | 2 +- 11 files changed, 48 insertions(+), 78 deletions(-) diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index 43d86dbeaf..ccc0dff5a4 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -90,13 +90,12 @@ void BackendRenderer::AcceptMessage(ref_ptr message) { case Message::UpdateReadManager: { - uint64_t tileRequestGeneration; - TTilesCollection tiles = m_requestedTiles->GetTiles(tileRequestGeneration); + TTilesCollection tiles = m_requestedTiles->GetTiles(); if (!tiles.empty()) { ScreenBase const screen = m_requestedTiles->GetScreen(); - bool const is3dBuildings = m_requestedTiles->Is3dBuildings(); - m_readManager->UpdateCoverage(screen, is3dBuildings, tileRequestGeneration, tiles, m_texMng); + bool const have3dBuildings = m_requestedTiles->Have3dBuildings(); + m_readManager->UpdateCoverage(screen, have3dBuildings, tiles, m_texMng); m_updateCurrentCountryFn(screen.ClipRect().Center(), (*tiles.begin()).m_zoomLevel); } break; @@ -144,8 +143,7 @@ void BackendRenderer::AcceptMessage(ref_ptr message) { ref_ptr msg = message; m_commutator->PostMessage(ThreadsCommutator::RenderThread, - make_unique_dp(msg->MoveTiles(), - msg->GetTileRequestGeneration()), + make_unique_dp(msg->MoveTiles()), MessagePriority::Normal); break; } diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 61cc261ddc..5cd2d1fc3c 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -225,9 +225,7 @@ void FrontendRenderer::UpdateCanBeDeletedStatus() } } } - - layer.m_isDirty |= group->UpdateCanBeDeletedStatus(canBeDeleted, m_currentZoomLevel, - make_ref(m_overlayTree), m_bucketsToDelete); + layer.m_isDirty |= group->UpdateCanBeDeletedStatus(canBeDeleted, m_currentZoomLevel, make_ref(m_overlayTree)); } } } @@ -284,10 +282,6 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) case Message::FinishTileRead: { ref_ptr msg = message; - bool const isLastRequest = m_tileRequestGeneration == msg->GetTileRequestGeneration(); - if (!isLastRequest) - break; - bool changed = false; for (auto const & tileKey : msg->GetTiles()) { @@ -611,7 +605,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) ScreenBase screen = m_userEventStream.GetCurrentScreen(); ResolveTileKeys(screen.ClipRect(), tiles); - m_requestedTiles->Set(screen, m_isIsometry || screen.isPerspective(), m_tileRequestGeneration, move(tiles)); + m_requestedTiles->Set(screen, m_isIsometry || screen.isPerspective(), move(tiles)); m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, make_unique_dp(), MessagePriority::UberHighSingleton); @@ -757,7 +751,7 @@ void FrontendRenderer::InvalidateRect(m2::RectD const & gRect) MessagePriority::High); blocker.Wait(); - m_requestedTiles->Set(screen, m_isIsometry || screen.isPerspective(), m_tileRequestGeneration, move(tiles)); + m_requestedTiles->Set(screen, m_isIsometry || screen.isPerspective(), move(tiles)); m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, make_unique_dp(), MessagePriority::UberHighSingleton); @@ -806,7 +800,7 @@ void FrontendRenderer::AddToRenderGroup(dp::GLState const & state, layer.m_isDirty = true; } -void FrontendRenderer::RemoveRenderGroups(TRenderGroupRemovePredicate const & predicate) +void FrontendRenderer::RemoveRenderGroupsLater(TRenderGroupRemovePredicate const & predicate) { ASSERT(predicate != nullptr, ()); @@ -829,7 +823,7 @@ bool FrontendRenderer::CheckTileGenerations(TileKey const & tileKey) { return group->GetTileKey() == tileKey && group->GetTileKey().m_generation < tileKey.m_generation; }; - RemoveRenderGroups(removePredicate); + RemoveRenderGroupsLater(removePredicate); return result; } @@ -1009,13 +1003,6 @@ void FrontendRenderer::RenderScene(ScreenBase const & modelView) #endif MergeBuckets(); - - int countToDelete = max(1, static_cast(m_bucketsToDelete.size()) / 2); - while (!m_bucketsToDelete.empty() && countToDelete > 0) - { - m_bucketsToDelete.pop_front(); - countToDelete--; - } } void FrontendRenderer::Render2dLayer(ScreenBase const & modelView) @@ -1365,12 +1352,18 @@ void FrontendRenderer::ResolveTileKeys(m2::RectD const & rect, TTilesCollection auto removePredicate = [this, &result, &tilesToDelete](drape_ptr const & group) { TileKey const & key = group->GetTileKey(); - return key.m_zoomLevel != m_currentZoomLevel || - key.m_x < result.m_minTileX || key.m_x > result.m_maxTileX || + return group->GetTileKey().m_zoomLevel == m_currentZoomLevel && + (key.m_x < result.m_minTileX || key.m_x > result.m_maxTileX || key.m_y < result.m_minTileY || key.m_y > result.m_maxTileY || - find(tilesToDelete.begin(), tilesToDelete.end(), key) != tilesToDelete.end(); + find(tilesToDelete.begin(), tilesToDelete.end(), key) != tilesToDelete.end()); }; - RemoveRenderGroups(removePredicate); + for (RenderLayer & layer : m_layers) + layer.m_isDirty |= RemoveGroups(removePredicate, layer.m_renderGroups, make_ref(m_overlayTree)); + + RemoveRenderGroupsLater([this](drape_ptr const & group) + { + return group->GetTileKey().m_zoomLevel != m_currentZoomLevel; + }); } FrontendRenderer::Routine::Routine(FrontendRenderer & renderer) : m_renderer(renderer) {} @@ -1431,7 +1424,7 @@ void FrontendRenderer::Routine::Do() m_renderer.PrepareScene(modelView); // Check for a frame is active. - bool isActiveFrame = modelViewChanged || viewportChanged || !m_renderer.m_bucketsToDelete.empty(); + bool isActiveFrame = modelViewChanged || viewportChanged; isActiveFrame |= m_renderer.m_texMng->UpdateDynamicTextures(); m_renderer.RenderScene(modelView); @@ -1577,12 +1570,7 @@ void FrontendRenderer::UpdateScene(ScreenBase const & modelView) for (RenderLayer & layer : m_layers) layer.m_isDirty |= RemoveGroups(removePredicate, layer.m_renderGroups, make_ref(m_overlayTree)); - if (m_lastReadModelView != modelView) - { - ++m_tileRequestGeneration; - m_lastReadModelView = modelView; - } - m_requestedTiles->Set(modelView, m_isIsometry || modelView.isPerspective(), m_tileRequestGeneration, move(tiles)); + m_requestedTiles->Set(modelView, m_isIsometry || modelView.isPerspective(), move(tiles)); m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, make_unique_dp(), MessagePriority::UberHighSingleton); diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index 7abff140b1..a89c1ca2d6 100755 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -206,7 +206,7 @@ private: TileKey const & newTile); using TRenderGroupRemovePredicate = function const &)>; - void RemoveRenderGroups(TRenderGroupRemovePredicate const & predicate); + void RemoveRenderGroupsLater(TRenderGroupRemovePredicate const & predicate); void FollowRoute(int preferredZoomLevel, int preferredZoomLevelIn3d, double rotationAngle, double angleFOV); @@ -247,7 +247,6 @@ private: array m_layers; vector> m_userMarkRenderGroups; set m_userMarkVisibility; - deque> m_bucketsToDelete; drape_ptr m_guiRenderer; drape_ptr m_myPositionController; @@ -273,8 +272,6 @@ private: TTapEventInfoFn m_tapEventInfoFn; TUserPositionChangedFn m_userPositionChangedFn; - uint64_t m_tileRequestGeneration = 0; - ScreenBase m_lastReadModelView; TTilesCollection m_notFinishedTiles; int m_currentZoomLevel = -1; diff --git a/drape_frontend/message_subclasses.hpp b/drape_frontend/message_subclasses.hpp index d856526c1b..b034e4d29e 100644 --- a/drape_frontend/message_subclasses.hpp +++ b/drape_frontend/message_subclasses.hpp @@ -97,20 +97,17 @@ public: class FinishTileReadMessage : public Message { public: - template FinishTileReadMessage(T && tiles, uint64_t tileRequestGeneration) + template FinishTileReadMessage(T && tiles) : m_tiles(forward(tiles)) - , m_tileRequestGeneration(tileRequestGeneration) {} Type GetType() const override { return Message::FinishTileRead; } TTilesCollection const & GetTiles() const { return m_tiles; } TTilesCollection && MoveTiles() { return move(m_tiles); } - uint64_t GetTileRequestGeneration() const { return m_tileRequestGeneration; } private: TTilesCollection m_tiles; - uint64_t m_tileRequestGeneration; }; class FlushRenderBucketMessage : public BaseTileMessage diff --git a/drape_frontend/read_manager.cpp b/drape_frontend/read_manager.cpp index bf2d8666a2..a2d6d20eb5 100755 --- a/drape_frontend/read_manager.cpp +++ b/drape_frontend/read_manager.cpp @@ -41,13 +41,12 @@ ReadManager::ReadManager(ref_ptr commutator, MapDataProvider , m_model(model) , m_pool(make_unique_dp(ReadCount(), bind(&ReadManager::OnTaskFinished, this, _1))) , m_forceUpdate(true) - , m_need3dBuildings(false) + , m_have3dBuildings(false) , m_allow3dBuildings(allow3dBuildings) , m_modeChanged(false) , myPool(64, ReadMWMTaskFactory(m_model)) , m_counter(0) , m_generationCounter(0) - , m_tileRequestGeneration(0) { } @@ -77,7 +76,7 @@ void ReadManager::OnTaskFinished(threads::IRoutine * task) TTilesCollection tiles; tiles.emplace(t->GetTileKey()); m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, - make_unique_dp(move(tiles), m_tileRequestGeneration), + make_unique_dp(move(tiles)), MessagePriority::Normal); } } @@ -86,15 +85,15 @@ void ReadManager::OnTaskFinished(threads::IRoutine * task) myPool.Return(t); } -void ReadManager::UpdateCoverage(ScreenBase const & screen, bool is3dBuildings, uint64_t tileRequestGeneration, +void ReadManager::UpdateCoverage(ScreenBase const & screen, bool have3dBuildings, TTilesCollection const & tiles, ref_ptr texMng) { if (screen == m_currentViewport && !m_forceUpdate) return; m_forceUpdate = false; - m_modeChanged |= m_need3dBuildings != is3dBuildings; - m_need3dBuildings = is3dBuildings; + m_modeChanged |= (m_have3dBuildings != have3dBuildings); + m_have3dBuildings = have3dBuildings; if (m_modeChanged || MustDropAllTiles(screen)) { @@ -103,7 +102,7 @@ void ReadManager::UpdateCoverage(ScreenBase const & screen, bool is3dBuildings, for_each(m_tileInfos.begin(), m_tileInfos.end(), bind(&ReadManager::CancelTileInfo, this, _1)); m_tileInfos.clear(); - IncreaseCounter(static_cast(tiles.size()), tileRequestGeneration); + IncreaseCounter(static_cast(tiles.size())); m_generationCounter++; for_each(tiles.begin(), tiles.end(), bind(&ReadManager::PushTaskBackForTileKey, this, _1, texMng)); @@ -139,7 +138,7 @@ void ReadManager::UpdateCoverage(ScreenBase const & screen, bool is3dBuildings, outdatedTiles.begin(), outdatedTiles.end(), back_inserter(readyTiles), LessCoverageCell()); - IncreaseCounter(static_cast(newTiles.size()), tileRequestGeneration); + IncreaseCounter(static_cast(newTiles.size())); CheckFinishedTiles(readyTiles); for_each(newTiles.begin(), newTiles.end(), bind(&ReadManager::PushTaskBackForTileKey, this, _1, texMng)); } @@ -210,7 +209,7 @@ void ReadManager::PushTaskBackForTileKey(TileKey const & tileKey, ref_ptr tileInfo(new TileInfo(make_unique_dp(TileKey(tileKey, m_generationCounter), m_commutator, texMng))); - tileInfo->Set3dBuildings(m_need3dBuildings && m_allow3dBuildings); + tileInfo->Set3dBuildings(m_have3dBuildings && m_allow3dBuildings); m_tileInfos.insert(tileInfo); ReadMWMTask * task = myPool.Get(); @@ -238,7 +237,7 @@ void ReadManager::CheckFinishedTiles(TTileInfoCollection const & requestedTiles) if (!finishedTiles.empty()) { m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, - make_unique_dp(move(finishedTiles), m_tileRequestGeneration), + make_unique_dp(move(finishedTiles)), MessagePriority::Normal); } } @@ -254,11 +253,10 @@ void ReadManager::ClearTileInfo(shared_ptr const & tileToClear) m_tileInfos.erase(tileToClear); } -void ReadManager::IncreaseCounter(int value, uint64_t tileRequestGeneration) +void ReadManager::IncreaseCounter(int value) { lock_guard lock(m_finishedTilesMutex); m_counter += value; - m_tileRequestGeneration = tileRequestGeneration; if (m_counter == 0) { diff --git a/drape_frontend/read_manager.hpp b/drape_frontend/read_manager.hpp index f1c84a4894..36df8d6cd2 100755 --- a/drape_frontend/read_manager.hpp +++ b/drape_frontend/read_manager.hpp @@ -29,7 +29,7 @@ class ReadManager public: ReadManager(ref_ptr commutator, MapDataProvider & model, bool allow3dBuildings); - void UpdateCoverage(ScreenBase const & screen, bool is3dBuildings, uint64_t tileRequestGeneration, + void UpdateCoverage(ScreenBase const & screen, bool have3dBuildings, TTilesCollection const & tiles, ref_ptr texMng); void Invalidate(TTilesCollection const & keyStorage); void InvalidateAll(); @@ -55,7 +55,7 @@ private: ScreenBase m_currentViewport; bool m_forceUpdate; - bool m_need3dBuildings; + bool m_have3dBuildings; bool m_allow3dBuildings; bool m_modeChanged; @@ -75,14 +75,13 @@ private: int m_counter; mutex m_finishedTilesMutex; uint64_t m_generationCounter; - uint64_t m_tileRequestGeneration; using TTileInfoCollection = buffer_vector, 8>; TTilesCollection m_activeTiles; void CancelTileInfo(shared_ptr const & tileToCancel); void ClearTileInfo(shared_ptr const & tileToClear); - void IncreaseCounter(int value, uint64_t tileRequestGeneration); + void IncreaseCounter(int value); void CheckFinishedTiles(TTileInfoCollection const & requestedTiles); }; diff --git a/drape_frontend/render_group.cpp b/drape_frontend/render_group.cpp index 6915e46e62..ffc8318b67 100755 --- a/drape_frontend/render_group.cpp +++ b/drape_frontend/render_group.cpp @@ -139,8 +139,7 @@ bool RenderGroup::IsLess(RenderGroup const & other) const return m_state < other.m_state; } -bool RenderGroup::UpdateCanBeDeletedStatus(bool canBeDeleted, int currentZoom, ref_ptr tree, - deque> & bucketsToDelete) +bool RenderGroup::UpdateCanBeDeletedStatus(bool canBeDeleted, int currentZoom, ref_ptr tree) { if (!IsPendingOnDelete()) return false; @@ -152,7 +151,6 @@ bool RenderGroup::UpdateCanBeDeletedStatus(bool canBeDeleted, int currentZoom, r { 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 5393c13f8c..de62ad03dd 100755 --- a/drape_frontend/render_group.hpp +++ b/drape_frontend/render_group.hpp @@ -69,8 +69,7 @@ public: bool IsPendingOnDelete() const { return m_pendingOnDelete; } bool CanBeDeleted() const { return m_canBeDeleted; } - bool UpdateCanBeDeletedStatus(bool canBeDeleted, int currentZoom, ref_ptr tree, - deque> & bucketsToDelete); + bool UpdateCanBeDeletedStatus(bool canBeDeleted, int currentZoom, ref_ptr tree); bool IsLess(RenderGroup const & other) const; diff --git a/drape_frontend/requested_tiles.cpp b/drape_frontend/requested_tiles.cpp index 52ff2bca19..3387d17f29 100755 --- a/drape_frontend/requested_tiles.cpp +++ b/drape_frontend/requested_tiles.cpp @@ -3,22 +3,19 @@ namespace df { -void RequestedTiles::Set(ScreenBase const & screen, bool is3dBuildings, - uint64_t tileRequestGeneration, TTilesCollection && tiles) +void RequestedTiles::Set(ScreenBase const & screen, bool have3dBuildings, TTilesCollection && tiles) { lock_guard lock(m_mutex); - m_tileRequestGeneration = tileRequestGeneration; m_tiles = move(tiles); m_screen = screen; - m_is3dBuildings = is3dBuildings; + m_have3dBuildings = have3dBuildings; } -TTilesCollection RequestedTiles::GetTiles(uint64_t & tileRequestGeneration) +TTilesCollection RequestedTiles::GetTiles() { TTilesCollection tiles; { lock_guard lock(m_mutex); - tileRequestGeneration = m_tileRequestGeneration; m_tiles.swap(tiles); } return tiles; @@ -30,10 +27,10 @@ ScreenBase RequestedTiles::GetScreen() return m_screen; } -bool RequestedTiles::Is3dBuildings() +bool RequestedTiles::Have3dBuildings() { lock_guard lock(m_mutex); - return m_is3dBuildings; + return m_have3dBuildings; } bool RequestedTiles::CheckTileKey(TileKey const & tileKey) const diff --git a/drape_frontend/requested_tiles.hpp b/drape_frontend/requested_tiles.hpp index a926c33c0d..891c69c2f1 100755 --- a/drape_frontend/requested_tiles.hpp +++ b/drape_frontend/requested_tiles.hpp @@ -13,18 +13,17 @@ class RequestedTiles { public: RequestedTiles() = default; - void Set(ScreenBase const & screen, bool is3dBuildings, uint64_t tileRequestGeneration, TTilesCollection && tiles); - TTilesCollection GetTiles(uint64_t & tileRequestGeneration); + void Set(ScreenBase const & screen, bool have3dBuildings, TTilesCollection && tiles); + TTilesCollection GetTiles(); ScreenBase GetScreen(); - bool Is3dBuildings(); + bool Have3dBuildings(); bool CheckTileKey(TileKey const & tileKey) const; private: TTilesCollection m_tiles; ScreenBase m_screen; - bool m_is3dBuildings = false; + bool m_have3dBuildings = false; mutable mutex m_mutex; - uint64_t m_tileRequestGeneration = 0; }; } // namespace df diff --git a/drape_frontend/user_event_stream.cpp b/drape_frontend/user_event_stream.cpp index 17fba951cd..c3c4eef0e8 100644 --- a/drape_frontend/user_event_stream.cpp +++ b/drape_frontend/user_event_stream.cpp @@ -136,7 +136,7 @@ ScreenBase const & UserEventStream::ProcessEvents(bool & modelViewChange, bool & swap(m_events, events); } - modelViewChange = !events.empty() || m_state != STATE_EMPTY; + modelViewChange = !events.empty() || m_state == STATE_SCALE || m_state == STATE_DRAG; bool breakAnim = false; for (UserEvent const & e : events) {