From 39236592a11bcc9ea94b3055bffbdb17e628cd5e Mon Sep 17 00:00:00 2001 From: Cellie Date: Wed, 17 Sep 2025 14:41:08 +0200 Subject: [PATCH 1/2] Dont initialize skipped tiles --- src/OpenStreetMap-esp32.cpp | 27 +++++++++++++-------------- src/OpenStreetMap-esp32.hpp | 11 ++++++++++- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/OpenStreetMap-esp32.cpp b/src/OpenStreetMap-esp32.cpp index 17cbbab..733e14e 100644 --- a/src/OpenStreetMap-esp32.cpp +++ b/src/OpenStreetMap-esp32.cpp @@ -215,23 +215,23 @@ void OpenStreetMap::makeJobList(const tileList &requiredTiles, std::vector= (1 << zoom)) { - tilePointers.push_back(nullptr); // we need to keep 1:1 grid alignment with requiredTiles for composeMap + tilePointers.emplace_back(nullptr, false); // keep alignment continue; } const CachedTile *cachedTile = isTileCached(x, y, zoom); if (cachedTile) { - tilePointers.push_back(cachedTile->buffer); + tilePointers.emplace_back(cachedTile->buffer, cachedTile->valid); continue; } - // Check if this tile is already in the job list const auto job = std::find_if(jobs.begin(), jobs.end(), [&](const TileJob &job) { return job.x == x && job.y == static_cast(y) && job.z == zoom; }); if (job != jobs.end()) { - tilePointers.push_back(job->tile->buffer); // reuse buffer from already queued job + // job->tile may or may not be valid yet + tilePointers.emplace_back(job->tile->buffer, job->tile->valid); continue; } @@ -239,11 +239,12 @@ void OpenStreetMap::makeJobList(const tileList &requiredTiles, std::vectorbuffer); // store buffer for rendering + // store buffer and current validity for rendering + tilePointers.emplace_back(tileToReplace->buffer, tileToReplace->valid); jobs.push_back({x, static_cast(y), zoom, tileToReplace}); // queue job } } @@ -284,13 +285,15 @@ bool OpenStreetMap::composeMap(LGFX_Sprite &mapSprite, TileBufferList &tilePoint { const int drawX = startOffsetX + (tileIndex % numberOfColums) * currentProvider->tileSize; const int drawY = startOffsetY + (tileIndex / numberOfColums) * currentProvider->tileSize; - const uint16_t *tile = tilePointers[tileIndex]; - if (!tile) + const TileBuffer &tile = tilePointers[tileIndex]; + + // If pointer missing or tile not yet valid, draw background + if (!tile.ptr || !tile.valid) { - mapSprite.fillRect(drawX, drawY, currentProvider->tileSize, currentProvider->tileSize, OSM_BGCOLOR); + mapSprite.fillRect(drawX, drawY, currentProvider->tileSize, currentProvider->tileSize, 0); continue; } - mapSprite.pushImage(drawX, drawY, currentProvider->tileSize, currentProvider->tileSize, tile); + mapSprite.pushImage(drawX, drawY, currentProvider->tileSize, currentProvider->tileSize, tile.ptr); } mapSprite.setTextColor(TFT_WHITE, OSM_BGCOLOR); @@ -530,10 +533,6 @@ void OpenStreetMap::invalidateTile(CachedTile *tile) { if (!tile) return; - - const size_t tileByteCount = currentProvider->tileSize * currentProvider->tileSize * 2; - memset(tile->buffer, 0, tileByteCount); - tile->valid = false; tile->busy = false; } diff --git a/src/OpenStreetMap-esp32.hpp b/src/OpenStreetMap-esp32.hpp index c5cd3fb..ee57a04 100644 --- a/src/OpenStreetMap-esp32.hpp +++ b/src/OpenStreetMap-esp32.hpp @@ -49,7 +49,16 @@ constexpr int OSM_SINGLECORE_NUMBER = 1; static_assert(OSM_SINGLECORE_NUMBER < 2, "OSM_SINGLECORE_NUMBER must be 0 or 1 (ESP32 has only 2 cores)"); using tileList = std::vector>; -using TileBufferList = std::vector; + +struct TileBuffer +{ + const uint16_t *ptr; + bool valid; + TileBuffer() : ptr(nullptr), valid(false) {} + TileBuffer(const uint16_t *p, bool v) : ptr(p), valid(v) {} +}; + +using TileBufferList = std::vector; namespace { From 3437cf97ffb7dc92d0d0dd2cec5ffff0ff1afe5c Mon Sep 17 00:00:00 2001 From: Cellie Date: Wed, 17 Sep 2025 14:48:33 +0200 Subject: [PATCH 2/2] Cleanup --- src/OpenStreetMap-esp32.cpp | 26 ++++++++++++++------------ src/OpenStreetMap-esp32.hpp | 7 +++---- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/OpenStreetMap-esp32.cpp b/src/OpenStreetMap-esp32.cpp index 733e14e..4eaf9b6 100644 --- a/src/OpenStreetMap-esp32.cpp +++ b/src/OpenStreetMap-esp32.cpp @@ -215,14 +215,14 @@ void OpenStreetMap::makeJobList(const tileList &requiredTiles, std::vector= (1 << zoom)) { - tilePointers.emplace_back(nullptr, false); // keep alignment + tilePointers.emplace_back(nullptr); // keep alignment continue; } const CachedTile *cachedTile = isTileCached(x, y, zoom); if (cachedTile) { - tilePointers.emplace_back(cachedTile->buffer, cachedTile->valid); + tilePointers.emplace_back(const_cast(cachedTile)); continue; } @@ -230,8 +230,7 @@ void OpenStreetMap::makeJobList(const tileList &requiredTiles, std::vector(y) && job.z == zoom; }); if (job != jobs.end()) { - // job->tile may or may not be valid yet - tilePointers.emplace_back(job->tile->buffer, job->tile->valid); + tilePointers.emplace_back(const_cast(cachedTile)); continue; } @@ -239,13 +238,13 @@ void OpenStreetMap::makeJobList(const tileList &requiredTiles, std::vectorbuffer, tileToReplace->valid); - jobs.push_back({x, static_cast(y), zoom, tileToReplace}); // queue job + tilePointers.emplace_back(tileToReplace); + jobs.push_back({x, static_cast(y), zoom, tileToReplace}); } } @@ -285,15 +284,18 @@ bool OpenStreetMap::composeMap(LGFX_Sprite &mapSprite, TileBufferList &tilePoint { const int drawX = startOffsetX + (tileIndex % numberOfColums) * currentProvider->tileSize; const int drawY = startOffsetY + (tileIndex / numberOfColums) * currentProvider->tileSize; - const TileBuffer &tile = tilePointers[tileIndex]; + const TileBuffer &tb = tilePointers[tileIndex]; + CachedTile *ct = tb.cached; - // If pointer missing or tile not yet valid, draw background - if (!tile.ptr || !tile.valid) + // draw background if no tile or tile not valid yet + if (!ct || !ct->valid || !ct->buffer) { - mapSprite.fillRect(drawX, drawY, currentProvider->tileSize, currentProvider->tileSize, 0); + mapSprite.fillRect(drawX, drawY, currentProvider->tileSize, currentProvider->tileSize, OSM_BGCOLOR); continue; } - mapSprite.pushImage(drawX, drawY, currentProvider->tileSize, currentProvider->tileSize, tile.ptr); + + // draw from live cached buffer + mapSprite.pushImage(drawX, drawY, currentProvider->tileSize, currentProvider->tileSize, ct->buffer); } mapSprite.setTextColor(TFT_WHITE, OSM_BGCOLOR); diff --git a/src/OpenStreetMap-esp32.hpp b/src/OpenStreetMap-esp32.hpp index ee57a04..24c1ceb 100644 --- a/src/OpenStreetMap-esp32.hpp +++ b/src/OpenStreetMap-esp32.hpp @@ -52,10 +52,9 @@ using tileList = std::vector>; struct TileBuffer { - const uint16_t *ptr; - bool valid; - TileBuffer() : ptr(nullptr), valid(false) {} - TileBuffer(const uint16_t *p, bool v) : ptr(p), valid(v) {} + CachedTile *cached; // nullptr = tile not present / out-of-range + TileBuffer() : cached(nullptr) {} + TileBuffer(CachedTile *c) : cached(c) {} }; using TileBufferList = std::vector;