From f24cd64d0abf512eb16e2efd92a161ebe9420430 Mon Sep 17 00:00:00 2001 From: Roman Kuznetsov Date: Sat, 12 Dec 2015 19:04:11 +0300 Subject: [PATCH] Improved tiles loading on 17-19 zoom levels --- drape_frontend/frontend_renderer.cpp | 36 +++++++++++++++++++++------- drape_frontend/frontend_renderer.hpp | 4 +++- drape_frontend/read_manager.cpp | 4 ++-- drape_frontend/rule_drawer.cpp | 8 ++++--- drape_frontend/rule_drawer.hpp | 1 - drape_frontend/tile_info.cpp | 9 +++---- drape_frontend/tile_key.cpp | 18 ++++++++++---- drape_frontend/tile_key.hpp | 3 ++- 8 files changed, 55 insertions(+), 28 deletions(-) diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 94b3e8b4c8..073d5956a0 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -48,6 +48,7 @@ FrontendRenderer::FrontendRenderer(Params const & params) , m_userPositionChangedFn(params.m_positionChangedFn) , m_tileTree(new TileTree()) , m_requestedTiles(params.m_requestedTiles) + , m_maxGeneration(0) { #ifdef DRAW_INFO m_tpf = 0.0; @@ -120,8 +121,8 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) bucket->GetBuffer()->Build(program); if (!IsUserMarkLayer(key)) { - CheckTileGenerations(key); - m_tileTree->ProcessTile(key, GetCurrentZoomLevel(), state, move(bucket)); + if (CheckTileGenerations(key)) + m_tileTree->ProcessTile(key, GetCurrentZoomLevelForData(), state, move(bucket)); } else { @@ -134,7 +135,9 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) case Message::FinishReading: { ref_ptr msg = message; - m_tileTree->FinishTiles(msg->GetTiles(), GetCurrentZoomLevel()); + for (auto const & tileKey : msg->GetTiles()) + CheckTileGenerations(tileKey); + m_tileTree->FinishTiles(msg->GetTiles(), GetCurrentZoomLevelForData()); break; } @@ -537,13 +540,20 @@ void FrontendRenderer::RemoveRenderGroups(TRenderGroupRemovePredicate const & pr m_deferredRenderGroups.end()); } -void FrontendRenderer::CheckTileGenerations(TileKey const & tileKey) +bool FrontendRenderer::CheckTileGenerations(TileKey const & tileKey) { + bool const result = (tileKey.m_generation >= m_maxGeneration); + + if (tileKey.m_generation > m_maxGeneration) + m_maxGeneration = tileKey.m_generation; + auto removePredicate = [&tileKey](drape_ptr const & group) { return group->GetTileKey() == tileKey && group->GetTileKey().m_generation < tileKey.m_generation; }; RemoveRenderGroups(removePredicate); + + return result; } void FrontendRenderer::OnCompassTapped() @@ -756,6 +766,12 @@ int FrontendRenderer::GetCurrentZoomLevel() const return m_currentZoomLevel; } +int FrontendRenderer::GetCurrentZoomLevelForData() const +{ + int const upperScale = scales::GetUpperScale(); + return (m_currentZoomLevel <= upperScale ? m_currentZoomLevel : upperScale); +} + void FrontendRenderer::ResolveZoomLevel(ScreenBase const & screen) { m_currentZoomLevel = GetDrawTileScale(screen); @@ -864,9 +880,10 @@ void FrontendRenderer::ResolveTileKeys(ScreenBase const & screen, TTilesCollecti void FrontendRenderer::ResolveTileKeys(m2::RectD const & rect, TTilesCollection & tiles) { // equal for x and y - int const tileScale = GetCurrentZoomLevel(); + int const zoomLevel = GetCurrentZoomLevelForData(); + double const range = MercatorBounds::maxX - MercatorBounds::minX; - double const rectSize = range / (1 << tileScale); + double const rectSize = range / (1 << zoomLevel); int const minTileX = static_cast(floor(rect.minX() / rectSize)); int const maxTileX = static_cast(ceil(rect.maxX() / rectSize)); @@ -874,14 +891,15 @@ void FrontendRenderer::ResolveTileKeys(m2::RectD const & rect, TTilesCollection int const maxTileY = static_cast(ceil(rect.maxY() / rectSize)); // request new tiles - m_tileTree->BeginRequesting(tileScale, rect); + m_tileTree->BeginRequesting(zoomLevel, rect); for (int tileY = minTileY; tileY < maxTileY; ++tileY) { for (int tileX = minTileX; tileX < maxTileX; ++tileX) { - TileKey key(tileX, tileY, tileScale); + TileKey key(tileX, tileY, zoomLevel); if (rect.IsIntersect(key.GetGlobalRect())) { + key.m_styleZoomLevel = GetCurrentZoomLevel(); tiles.insert(key); m_tileTree->RequestTile(key); } @@ -1072,7 +1090,7 @@ void FrontendRenderer::UpdateScene(ScreenBase const & modelView) auto removePredicate = [this](drape_ptr const & group) { - return group->IsOverlay() && group->GetTileKey().m_zoomLevel > GetCurrentZoomLevel(); + return group->IsOverlay() && group->GetTileKey().m_styleZoomLevel > GetCurrentZoomLevel(); }; RemoveRenderGroups(removePredicate); diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index 2c40ac8865..89d5473560 100755 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -147,6 +147,7 @@ private: void ResolveTileKeys(ScreenBase const & screen, TTilesCollection & tiles); void ResolveTileKeys(m2::RectD const & rect, TTilesCollection & tiles); int GetCurrentZoomLevel() const; + int GetCurrentZoomLevelForData() const; void ResolveZoomLevel(ScreenBase const & screen); void OnTap(m2::PointD const & pt, bool isLong) override; @@ -197,7 +198,7 @@ private: using TRenderGroupRemovePredicate = function const &)>; void RemoveRenderGroups(TRenderGroupRemovePredicate const & predicate); - void CheckTileGenerations(TileKey const & tileKey); + bool CheckTileGenerations(TileKey const & tileKey); void OnCompassTapped(); @@ -230,6 +231,7 @@ private: unique_ptr m_tileTree; int m_currentZoomLevel = -1; ref_ptr m_requestedTiles; + uint64_t m_maxGeneration; }; } // namespace df diff --git a/drape_frontend/read_manager.cpp b/drape_frontend/read_manager.cpp index 5559c80049..68885e871b 100755 --- a/drape_frontend/read_manager.cpp +++ b/drape_frontend/read_manager.cpp @@ -171,8 +171,8 @@ size_t ReadManager::ReadCount() bool ReadManager::MustDropAllTiles(ScreenBase const & screen) const { - int const oldScale = df::GetTileScaleBase(m_currentViewport); - int const newScale = df::GetTileScaleBase(screen); + int const oldScale = df::GetDrawTileScale(m_currentViewport); + int const newScale = df::GetDrawTileScale(screen); return (oldScale != newScale) || !m_currentViewport.GlobalRect().IsIntersect(screen.GlobalRect()); } diff --git a/drape_frontend/rule_drawer.cpp b/drape_frontend/rule_drawer.cpp index 461fdc2e05..316dd17e02 100644 --- a/drape_frontend/rule_drawer.cpp +++ b/drape_frontend/rule_drawer.cpp @@ -50,9 +50,11 @@ RuleDrawer::RuleDrawer(TDrawerCallback const & fn, m_globalRect = m_context->GetTileKey().GetGlobalRect(); int32_t tileSize = df::VisualParams::Instance().GetTileSize(); - m_geometryConvertor.OnSize(0, 0, tileSize, tileSize); - m_geometryConvertor.SetFromRect(m2::AnyRectD(m_globalRect)); - m_currentScaleGtoP = 1.0f / m_geometryConvertor.GetScale(); + m2::RectD const r = m_context->GetTileKey().GetGlobalRect(true /* considerStyleZoom */); + ScreenBase geometryConvertor; + geometryConvertor.OnSize(0, 0, tileSize, tileSize); + geometryConvertor.SetFromRect(m2::AnyRectD(r)); + m_currentScaleGtoP = 1.0f / geometryConvertor.GetScale(); for (size_t i = 0; i < m_mapShapes.size(); i++) m_mapShapes[i].reserve(kMinFlushSizes[i] + 1); diff --git a/drape_frontend/rule_drawer.hpp b/drape_frontend/rule_drawer.hpp index 76b90e55e7..2b89e47388 100644 --- a/drape_frontend/rule_drawer.hpp +++ b/drape_frontend/rule_drawer.hpp @@ -43,7 +43,6 @@ private: ref_ptr m_context; m2::RectD m_globalRect; - ScreenBase m_geometryConvertor; double m_currentScaleGtoP; array m_mapShapes; diff --git a/drape_frontend/tile_info.cpp b/drape_frontend/tile_info.cpp index 6e657f8631..92dd7bb29f 100644 --- a/drape_frontend/tile_info.cpp +++ b/drape_frontend/tile_info.cpp @@ -99,11 +99,9 @@ void TileInfo::ProcessID(FeatureID const & id) void TileInfo::InitStylist(FeatureType const & f, Stylist & s) { CheckCanceled(); - df::InitStylist(f, m_context->GetTileKey().m_zoomLevel, s); + df::InitStylist(f, m_context->GetTileKey().m_styleZoomLevel, s); } -//====================================================// - bool TileInfo::DoNeedReadIndex() const { return m_featureInfo.empty(); @@ -117,9 +115,8 @@ void TileInfo::CheckCanceled() const int TileInfo::GetZoomLevel() const { - int const upperScale = scales::GetUpperScale(); - int const zoomLevel = m_context->GetTileKey().m_zoomLevel; - return (zoomLevel <= upperScale ? zoomLevel : upperScale); + ASSERT_LESS_OR_EQUAL(m_context->GetTileKey().m_zoomLevel, scales::GetUpperScale(), ()); + return m_context->GetTileKey().m_zoomLevel; } } // namespace df diff --git a/drape_frontend/tile_key.cpp b/drape_frontend/tile_key.cpp index 16a22c5958..3df98714ca 100755 --- a/drape_frontend/tile_key.cpp +++ b/drape_frontend/tile_key.cpp @@ -6,16 +6,23 @@ namespace df { TileKey::TileKey() - : m_x(-1), m_y(-1), m_zoomLevel(-1), m_generation(0) + : m_x(-1), m_y(-1), + m_zoomLevel(-1), + m_styleZoomLevel(-1), + m_generation(0) {} TileKey::TileKey(int x, int y, int zoomLevel) - : m_x(x), m_y(y), m_zoomLevel(zoomLevel), m_generation(0) + : m_x(x), m_y(y), + m_zoomLevel(zoomLevel), + m_styleZoomLevel(zoomLevel), + m_generation(0) {} TileKey::TileKey(TileKey const & key, uint64_t generation) : m_x(key.m_x), m_y(key.m_y), m_zoomLevel(key.m_zoomLevel), + m_styleZoomLevel(key.m_styleZoomLevel), m_generation(generation) {} @@ -37,9 +44,9 @@ bool TileKey::operator ==(TileKey const & other) const m_zoomLevel == other.m_zoomLevel; } -m2::RectD TileKey::GetGlobalRect() const +m2::RectD TileKey::GetGlobalRect(bool considerStyleZoom) const { - double const worldSizeDevisor = 1 << m_zoomLevel; + double const worldSizeDevisor = 1 << (considerStyleZoom ? m_styleZoomLevel : m_zoomLevel); // Mercator SizeX and SizeY is equal double const rectSize = (MercatorBounds::maxX - MercatorBounds::minX) / worldSizeDevisor; @@ -53,7 +60,8 @@ string DebugPrint(TileKey const & key) { ostringstream out; out << "[x = " << key.m_x << ", y = " << key.m_y << ", zoomLevel = " - << key.m_zoomLevel << ", gen = " << key.m_generation << "]"; + << key.m_zoomLevel << ", styleZoomLevel = " << key.m_styleZoomLevel + << ", gen = " << key.m_generation << "]"; return out.str(); } diff --git a/drape_frontend/tile_key.hpp b/drape_frontend/tile_key.hpp index f51fa3a77e..20d4c0a677 100755 --- a/drape_frontend/tile_key.hpp +++ b/drape_frontend/tile_key.hpp @@ -26,11 +26,12 @@ struct TileKey bool operator < (TileKey const & other) const; bool operator == (TileKey const & other) const; - m2::RectD GetGlobalRect() const; + m2::RectD GetGlobalRect(bool considerStyleZoom = false) const; int m_x; int m_y; int m_zoomLevel; + int m_styleZoomLevel; uint64_t m_generation; };