From c58707efde49a0bac8ed4f0eacd0cbb0dc910209 Mon Sep 17 00:00:00 2001 From: Cellie Date: Sun, 8 Jun 2025 22:48:58 +0200 Subject: [PATCH 1/2] Prevent duplicate tile fetch jobs by checking for already queued tiles in `makeJobList()` --- src/OpenStreetMap-esp32.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/OpenStreetMap-esp32.cpp b/src/OpenStreetMap-esp32.cpp index 5f1c575..10433d9 100644 --- a/src/OpenStreetMap-esp32.cpp +++ b/src/OpenStreetMap-esp32.cpp @@ -225,6 +225,14 @@ void OpenStreetMap::makeJobList(const tileList &requiredTiles, std::vector(y) && job.z == zoom; }); + if (alreadyQueued) + { + tilePointers.push_back(nullptr); // maintain alignment + continue; + } + CachedTile *tileToReplace = findUnusedTile(requiredTiles, zoom); if (!tileToReplace) { From a530bebf25f00ec95e6f29ba88f0552403a0708d Mon Sep 17 00:00:00 2001 From: Cellie Date: Sun, 8 Jun 2025 23:22:51 +0200 Subject: [PATCH 2/2] Fixed logic --- src/OpenStreetMap-esp32.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/OpenStreetMap-esp32.cpp b/src/OpenStreetMap-esp32.cpp index 10433d9..de007cc 100644 --- a/src/OpenStreetMap-esp32.cpp +++ b/src/OpenStreetMap-esp32.cpp @@ -225,11 +225,12 @@ void OpenStreetMap::makeJobList(const tileList &requiredTiles, std::vector(y) && job.z == zoom; }); - if (alreadyQueued) + // Check if this tile is already in the job list + auto existing = std::find_if(jobs.begin(), jobs.end(), [&](const TileJob &job) + { return job.x == x && job.y == static_cast(y) && job.z == zoom; }); + if (existing != jobs.end()) { - tilePointers.push_back(nullptr); // maintain alignment + tilePointers.push_back(existing->tile->buffer); // reuse buffer from already queued job continue; } @@ -240,8 +241,8 @@ void OpenStreetMap::makeJobList(const tileList &requiredTiles, std::vectorbuffer); // push_back the still-to-download tile ptr - jobs.push_back({x, static_cast(y), zoom, tileToReplace}); // push_back tile ptr to the job list + tilePointers.push_back(tileToReplace->buffer); // store buffer for rendering + jobs.push_back({x, static_cast(y), zoom, tileToReplace}); // queue job } }