diff --git a/drape_frontend/backend_renderer.cpp b/drape_frontend/backend_renderer.cpp index 3c5d02f877..67a9e84e91 100644 --- a/drape_frontend/backend_renderer.cpp +++ b/drape_frontend/backend_renderer.cpp @@ -114,9 +114,9 @@ void BackendRenderer::AcceptMessage(ref_ptr message) { ScreenBase screen; bool have3dBuildings; - bool needRegenerateTraffic; - m_requestedTiles->GetParams(screen, have3dBuildings, needRegenerateTraffic); - m_readManager->UpdateCoverage(screen, have3dBuildings, needRegenerateTraffic, tiles, m_texMng); + bool forceRequest; + m_requestedTiles->GetParams(screen, have3dBuildings, forceRequest); + m_readManager->UpdateCoverage(screen, have3dBuildings, forceRequest, tiles, m_texMng); m_updateCurrentCountryFn(screen.ClipRect().Center(), (*tiles.begin()).m_zoomLevel); } break; diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index 4fb766c64f..7da63bf1f7 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -135,10 +135,10 @@ FrontendRenderer::FrontendRenderer(Params && params) , m_requestedTiles(params.m_requestedTiles) , m_maxGeneration(0) , m_needRestoreSize(false) - , m_needRegenerateTraffic(false) , m_trafficEnabled(params.m_trafficEnabled) , m_overlaysTracker(new OverlaysTracker()) , m_overlaysShowStatsCallback(move(params.m_overlaysShowStatsCallback)) + , m_forceUpdateScene(false) #ifdef SCENARIO_ENABLE , m_scenarioManager(new ScenarioManager(this)) #endif @@ -339,7 +339,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) ScreenBase const & screen = m_userEventStream.GetCurrentScreen(); CheckIsometryMinScale(screen); UpdateDisplacementEnabled(); - InvalidateRect(screen.ClipRect()); + m_forceUpdateScene = true; } if (m_guiRenderer->HasWidget(gui::WIDGET_RULER)) @@ -623,7 +623,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) { m_enable3dBuildings = msg->Allow3dBuildings(); CheckIsometryMinScale(screen); - InvalidateRect(screen.ClipRect()); + m_forceUpdateScene = true; } if (m_enablePerspectiveInNavigation != msg->AllowPerspective()) @@ -731,7 +731,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) ref_ptr msg = message; m_trafficEnabled = msg->IsTrafficEnabled(); if (msg->IsTrafficEnabled()) - m_needRegenerateTraffic = true; + m_forceUpdateScene = true; else m_trafficRenderer->ClearGLDependentResources(); break; @@ -740,7 +740,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) case Message::RegenerateTraffic: case Message::SetSimplifiedTrafficColors: { - m_needRegenerateTraffic = true; + m_forceUpdateScene = true; break; } @@ -781,8 +781,7 @@ void FrontendRenderer::AcceptMessage(ref_ptr message) { ref_ptr msg = message; m_overlaysTracker->SetTrackedOverlaysFeatures(msg->AcceptSymbolsFeatures()); - ScreenBase const & screen = m_userEventStream.GetCurrentScreen(); - InvalidateRect(screen.ClipRect()); + m_forceUpdateScene = true; break; } @@ -835,7 +834,7 @@ void FrontendRenderer::UpdateGLResources() // Request new tiles. ScreenBase screen = m_userEventStream.GetCurrentScreen(); m_lastReadedModelView = screen; - m_requestedTiles->Set(screen, m_isIsometry || screen.isPerspective(), m_needRegenerateTraffic, ResolveTileKeys(screen)); + m_requestedTiles->Set(screen, m_isIsometry || screen.isPerspective(), m_forceUpdateScene, ResolveTileKeys(screen)); m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, make_unique_dp(), MessagePriority::UberHighSingleton); @@ -890,8 +889,8 @@ void FrontendRenderer::InvalidateRect(m2::RectD const & gRect) // Request new tiles. m_lastReadedModelView = screen; - m_requestedTiles->Set(screen, m_isIsometry || screen.isPerspective(), - m_needRegenerateTraffic, ResolveTileKeys(screen)); + m_requestedTiles->Set(screen, m_isIsometry || screen.isPerspective(), m_forceUpdateScene, + ResolveTileKeys(screen)); m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, make_unique_dp(), MessagePriority::UberHighSingleton); @@ -1748,7 +1747,7 @@ void FrontendRenderer::Routine::Do() isActiveFrame |= m_renderer.m_texMng->UpdateDynamicTextures(); m_renderer.RenderScene(modelView); - if (modelViewChanged || m_renderer.m_needRegenerateTraffic) + if (modelViewChanged || m_renderer.m_forceUpdateScene) m_renderer.UpdateScene(modelView); isActiveFrame |= InterpolationHolder::Instance().Advance(frameTime); @@ -1911,16 +1910,16 @@ 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_needRegenerateTraffic || m_lastReadedModelView != modelView) + if (m_forceUpdateScene || m_lastReadedModelView != modelView) { EmitModelViewChanged(modelView); m_lastReadedModelView = modelView; - m_requestedTiles->Set(modelView, m_isIsometry || modelView.isPerspective(), m_needRegenerateTraffic, + m_requestedTiles->Set(modelView, m_isIsometry || modelView.isPerspective(), m_forceUpdateScene, ResolveTileKeys(modelView)); m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread, make_unique_dp(), MessagePriority::UberHighSingleton); - m_needRegenerateTraffic = false; + m_forceUpdateScene = false; } } diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index 7da2399699..6f6666108f 100755 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -333,12 +333,13 @@ private: bool m_needRestoreSize; - bool m_needRegenerateTraffic; bool m_trafficEnabled; drape_ptr m_overlaysTracker; OverlaysShowStatsCallback m_overlaysShowStatsCallback; + bool m_forceUpdateScene; + drape_ptr m_scenarioManager; #ifdef DEBUG diff --git a/drape_frontend/read_manager.cpp b/drape_frontend/read_manager.cpp index a944a675a6..7d500ff7c7 100755 --- a/drape_frontend/read_manager.cpp +++ b/drape_frontend/read_manager.cpp @@ -87,13 +87,13 @@ void ReadManager::OnTaskFinished(threads::IRoutine * task) myPool.Return(t); } -void ReadManager::UpdateCoverage(ScreenBase const & screen, bool have3dBuildings, bool needRegenerateTraffic, +void ReadManager::UpdateCoverage(ScreenBase const & screen, bool have3dBuildings, bool forceUpdate, TTilesCollection const & tiles, ref_ptr texMng) { m_modeChanged |= (m_have3dBuildings != have3dBuildings); m_have3dBuildings = have3dBuildings; - if (m_modeChanged || needRegenerateTraffic || MustDropAllTiles(screen)) + if (m_modeChanged || forceUpdate || MustDropAllTiles(screen)) { m_modeChanged = false; diff --git a/drape_frontend/read_manager.hpp b/drape_frontend/read_manager.hpp index 6660e72a23..e8ced849fe 100755 --- a/drape_frontend/read_manager.hpp +++ b/drape_frontend/read_manager.hpp @@ -32,7 +32,7 @@ public: ReadManager(ref_ptr commutator, MapDataProvider & model, bool allow3dBuildings, bool trafficEnabled); - void UpdateCoverage(ScreenBase const & screen, bool have3dBuildings, bool needRegenerateTraffic, + void UpdateCoverage(ScreenBase const & screen, bool have3dBuildings, bool forceUpdate, TTilesCollection const & tiles, ref_ptr texMng); void Invalidate(TTilesCollection const & keyStorage); void InvalidateAll(); diff --git a/drape_frontend/requested_tiles.cpp b/drape_frontend/requested_tiles.cpp index 64c6932862..4624dc9b56 100755 --- a/drape_frontend/requested_tiles.cpp +++ b/drape_frontend/requested_tiles.cpp @@ -3,14 +3,14 @@ namespace df { -void RequestedTiles::Set(ScreenBase const & screen, bool have3dBuildings, - bool needRegenerateTraffic, TTilesCollection && tiles) +void RequestedTiles::Set(ScreenBase const & screen, bool have3dBuildings, bool forceRequest, + TTilesCollection && tiles) { lock_guard lock(m_mutex); m_tiles = move(tiles); m_screen = screen; m_have3dBuildings = have3dBuildings; - m_needRegenerateTraffic = needRegenerateTraffic; + m_forceRequest = forceRequest; } TTilesCollection RequestedTiles::GetTiles() @@ -23,13 +23,12 @@ TTilesCollection RequestedTiles::GetTiles() return tiles; } -void RequestedTiles::GetParams(ScreenBase & screen, bool & have3dBuildings, - bool & needRegenerateTraffic) +void RequestedTiles::GetParams(ScreenBase & screen, bool & have3dBuildings, bool & forceRequest) { lock_guard lock(m_mutex); screen = m_screen; have3dBuildings = m_have3dBuildings; - needRegenerateTraffic = m_needRegenerateTraffic; + forceRequest = m_forceRequest; } bool RequestedTiles::CheckTileKey(TileKey const & tileKey) const @@ -41,4 +40,4 @@ bool RequestedTiles::CheckTileKey(TileKey const & tileKey) const return m_tiles.find(tileKey) != m_tiles.end(); } -} //namespace df +} // namespace df diff --git a/drape_frontend/requested_tiles.hpp b/drape_frontend/requested_tiles.hpp index a5945bee8d..90f6a830f7 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 have3dBuildings, - bool needRegenerateTraffic, TTilesCollection && tiles); + void Set(ScreenBase const & screen, bool have3dBuildings, bool forceRequest, + TTilesCollection && tiles); TTilesCollection GetTiles(); - void GetParams(ScreenBase & screen, bool & have3dBuildings, - bool & needRegenerateTraffic); + void GetParams(ScreenBase & screen, bool & have3dBuildings, bool & forceRequest); bool CheckTileKey(TileKey const & tileKey) const; private: TTilesCollection m_tiles; ScreenBase m_screen; bool m_have3dBuildings = false; - bool m_needRegenerateTraffic = false; + bool m_forceRequest = false; mutable mutex m_mutex; }; diff --git a/map/local_ads_manager.cpp b/map/local_ads_manager.cpp index 7c83983eb2..1a0ce69540 100644 --- a/map/local_ads_manager.cpp +++ b/map/local_ads_manager.cpp @@ -11,6 +11,8 @@ #include "coding/file_container.hpp" #include "coding/file_name_utils.hpp" +#include "base/bits.hpp" + namespace { std::string const kCampaignFile = "local_ads_campaigns.dat"; @@ -19,11 +21,12 @@ auto constexpr kWWanUpdateTimeout = std::chrono::hours(12); std::vector SerializeTimestamp(std::chrono::steady_clock::time_point ts) { - long hours = std::chrono::duration_cast(ts.time_since_epoch()).count(); + auto hours = std::chrono::duration_cast(ts.time_since_epoch()).count(); + uint64_t const encodedHours = bits::ZigZagEncode(static_cast(hours)); std::vector result; MemWriter writer(result); - writer.Write(&hours, sizeof(hours)); + writer.Write(&encodedHours, sizeof(encodedHours)); return result; } @@ -37,9 +40,10 @@ std::chrono::steady_clock::time_point DeserializeTimestamp(ModelReaderPtr const MemReaderWithExceptions memReader(bytes.data(), bytes.size()); ReaderSource src(memReader); - long hours = ReadPrimitiveFromSource(src); + uint64_t hours = ReadPrimitiveFromSource(src); + int64_t const decodedHours = bits::ZigZagDecode(hours); - return std::chrono::steady_clock::time_point(std::chrono::hours(hours)); + return std::chrono::steady_clock::time_point(std::chrono::hours(decodedHours)); } std::string GetPath(std::string const & fileName) @@ -129,7 +133,7 @@ void LocalAdsManager::UpdateViewport(ScreenBase const & screen) if (!needUpdateByTimeout && it != m_expiration.end()) { auto const currentTime = std::chrono::steady_clock::now(); - needUpdateByTimeout = (currentTime - it->second) > kWWanUpdateTimeout; + needUpdateByTimeout = currentTime > (it->second + kWWanUpdateTimeout); } if (needUpdateByTimeout || it == m_expiration.end()) @@ -152,7 +156,7 @@ void LocalAdsManager::ThreadRoutine() std::string const campaignFile = GetPath(kCampaignFile); std::string const expirationFile = GetPath(kExpirationFile); - // Read persistence data (expiration file must be read the first). + // Read persistence data (expiration file must be read first). ReadExpirationFile(expirationFile); ReadCampaignFile(campaignFile); @@ -321,7 +325,7 @@ void LocalAdsManager::ReadCampaignFile(std::string const & campaignFile) ASSERT(m_expiration.find(tag) != m_expiration.end(), ()); auto ts = m_expiration[tag]; - auto symbols = DeserializeCampaign(std::move(rawData), ts); + auto const symbols = DeserializeCampaign(std::move(rawData), ts); allSymbols.insert(symbols.begin(), symbols.end()); }); SendSymbolsToRendering(std::move(allSymbols)); @@ -334,6 +338,9 @@ void LocalAdsManager::ReadCampaignFile(std::string const & campaignFile) void LocalAdsManager::SendSymbolsToRendering(df::CustomSymbols && symbols) { + if (symbols.empty()) + return; + if (m_drapeEngine == nullptr) { std::lock_guard lock(m_symbolsCacheMutex);