diff --git a/src/client.cpp b/src/client.cpp index 63f720f04..fdabfa2d8 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -540,20 +540,19 @@ void Client::step(float dtime) } if (r.mesh) { - minimap_mapblock = r.mesh->getMinimapMapblock(); - do_mapper_update = (minimap_mapblock != NULL); + minimap_mapblock = r.mesh->moveMinimapMapblock(); + if (minimap_mapblock == NULL) + do_mapper_update = false; } if (r.mesh && r.mesh->getMesh()->getMeshBufferCount() == 0) { delete r.mesh; - block->mesh = NULL; } else { // Replace with the new mesh block->mesh = r.mesh; } } else { delete r.mesh; - minimap_mapblock = NULL; } if (do_mapper_update) diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp index 32f6e659a..33597b2fc 100644 --- a/src/mapblock_mesh.cpp +++ b/src/mapblock_mesh.cpp @@ -1278,6 +1278,7 @@ MapBlockMesh::~MapBlockMesh() { m_mesh->drop(); m_mesh = NULL; + delete m_minimap_mapblock; } bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_ratio) diff --git a/src/mapblock_mesh.h b/src/mapblock_mesh.h index 283006331..8e994ec6b 100644 --- a/src/mapblock_mesh.h +++ b/src/mapblock_mesh.h @@ -104,14 +104,16 @@ public: // Returns true if anything has been changed. bool animate(bool faraway, float time, int crack, u32 daynight_ratio); - scene::SMesh* getMesh() + scene::SMesh *getMesh() { return m_mesh; } - MinimapMapblock* getMinimapMapblock() + MinimapMapblock *moveMinimapMapblock() { - return m_minimap_mapblock; + MinimapMapblock *p = m_minimap_mapblock; + m_minimap_mapblock = NULL; + return p; } bool isAnimationForced() const diff --git a/src/minimap.cpp b/src/minimap.cpp index d37a083ef..950202c6a 100644 --- a/src/minimap.cpp +++ b/src/minimap.cpp @@ -102,7 +102,13 @@ void MinimapUpdateThread::doUpdate() while (popBlockUpdate(&update)) { if (update.data) { - m_blocks_cache[update.pos] = update.data; + // Swap two values in the map using single lookup + std::pair::iterator, bool> + result = m_blocks_cache.insert(std::make_pair(update.pos, update.data)); + if (result.second == false) { + delete result.first->second; + result.first->second = update.data; + } } else { std::map::iterator it; it = m_blocks_cache.find(update.pos);