From b128666a0462ebb82c686b75a628322f2fd49b28 Mon Sep 17 00:00:00 2001 From: rachytski Date: Wed, 28 Sep 2011 20:28:47 +0300 Subject: [PATCH] improving responsiveness of tile rendering while zooming. --- map/coverage_generator.cpp | 3 +++ map/screen_coverage.cpp | 8 ++++++-- map/tile_renderer.cpp | 18 +++++++++++++++++- map/tile_renderer.hpp | 6 ++++++ 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/map/coverage_generator.cpp b/map/coverage_generator.cpp index 1712605b6c..b319ec9adb 100644 --- a/map/coverage_generator.cpp +++ b/map/coverage_generator.cpp @@ -69,7 +69,10 @@ void CoverageGenerator::AddCoverScreenTask(ScreenBase const & screen) return; m_currentScreen = screen; + + m_queue.Clear(); m_sequenceID++; + m_queue.CancelCommands(); m_queue.AddCommand(bind(&CoverageGenerator::CoverScreen, this, screen, m_sequenceID)); } diff --git a/map/screen_coverage.cpp b/map/screen_coverage.cpp index 20d98bc43a..429f30f959 100644 --- a/map/screen_coverage.cpp +++ b/map/screen_coverage.cpp @@ -201,12 +201,16 @@ void ScreenCoverage::SetScreen(ScreenBase const & screen, bool /*mergePathNames* m_stylesCache->upload(); } + /// clearing all old commands + m_tileRenderer->ClearCommands(); + /// setting new sequenceID + m_tileRenderer->SetSequenceID(m_tiler.sequenceID()); + /// cancelling commands in progress + m_tileRenderer->CancelCommands(); /// adding commands for tiles which aren't in cache for (size_t i = 0; i < newRects.size(); ++i) - { m_tileRenderer->AddCommand(newRects[i], m_tiler.sequenceID(), bind(&CoverageGenerator::AddMergeTileTask, m_coverageGenerator, newRects[i])); - } } diff --git a/map/tile_renderer.cpp b/map/tile_renderer.cpp index 1d2968535f..8249d00307 100644 --- a/map/tile_renderer.cpp +++ b/map/tile_renderer.cpp @@ -187,7 +187,7 @@ void TileRenderer::DrawTile(core::CommandsQueue::Environment const & env, void TileRenderer::AddCommand(Tiler::RectInfo const & rectInfo, int sequenceID, core::CommandsQueue::Chain const & afterTileFns) { - m_sequenceID = sequenceID; + SetSequenceID(sequenceID); core::CommandsQueue::Chain chain; chain.addCommand(bind(&TileRenderer::DrawTile, this, _1, rectInfo, sequenceID)); @@ -196,6 +196,21 @@ void TileRenderer::AddCommand(Tiler::RectInfo const & rectInfo, int sequenceID, m_queue.AddCommand(chain); } +void TileRenderer::CancelCommands() +{ + m_queue.CancelCommands(); +} + +void TileRenderer::ClearCommands() +{ + m_queue.Clear(); +} + +void TileRenderer::SetSequenceID(int sequenceID) +{ + m_sequenceID = sequenceID; +} + TileCache & TileRenderer::GetTileCache() { return m_tileCache; @@ -227,3 +242,4 @@ void TileRenderer::AddTile(Tiler::RectInfo const & rectInfo, Tile const & tile) m_tileCache.writeUnlock(); } + diff --git a/map/tile_renderer.hpp b/map/tile_renderer.hpp index f7916ea79f..7cebd222f0 100644 --- a/map/tile_renderer.hpp +++ b/map/tile_renderer.hpp @@ -87,6 +87,12 @@ public: /// wait on a condition variable for an empty queue. void WaitForEmptyAndFinished(); + void SetSequenceID(int sequenceID); + + void CancelCommands(); + + void ClearCommands(); + bool HasTile(Tiler::RectInfo const & rectInfo); void AddTile(Tiler::RectInfo const & rectInfo, Tile const & tile); };