From 9017dbbbdb1f59971b17976d7cf95fe39469d82a Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Sun, 13 Oct 2013 14:44:12 +0200 Subject: [PATCH] Fixed CTerrain-related memory leaks --- src/graphics/engine/engine.cpp | 26 ++++++++++++++++++++++++++ src/graphics/engine/terrain.cpp | 19 ++++++++++++++++++- src/graphics/engine/terrain.h | 2 +- src/object/robotmain.cpp | 3 ++- 4 files changed, 47 insertions(+), 3 deletions(-) diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp index 669ea425..e973eec1 100644 --- a/src/graphics/engine/engine.cpp +++ b/src/graphics/engine/engine.cpp @@ -600,6 +600,31 @@ void CEngine::DeleteBaseObject(int baseObjRank) void CEngine::DeleteAllBaseObjects() { + for (int baseObjRank = 0; baseObjRank < static_cast( m_baseObjects.size() ); baseObjRank++) + { + EngineBaseObject& p1 = m_baseObjects[baseObjRank]; + if (! p1.used) + continue; + + for (int l2 = 0; l2 < static_cast( p1.next.size() ); l2++) + { + EngineBaseObjTexTier& p2 = p1.next[l2]; + + for (int l3 = 0; l3 < static_cast( p2.next.size() ); l3++) + { + EngineBaseObjLODTier& p3 = p2.next[l3]; + + for (int l4 = 0; l4 < static_cast( p3.next.size() ); l4++) + { + EngineBaseObjDataTier& p4 = p3.next[l4]; + + m_device->DestroyStaticBuffer(p4.staticBufferId); + p4.staticBufferId = 0; + } + } + } + } + m_baseObjects.clear(); } @@ -817,6 +842,7 @@ int CEngine::CreateObject() m_objects[objRank].drawWorld = true; m_objects[objRank].distance = 0.0f; + m_objects[objRank].baseObjRank = -1; m_objects[objRank].shadowRank = -1; return objRank; diff --git a/src/graphics/engine/terrain.cpp b/src/graphics/engine/terrain.cpp index 4fe3057f..4b5384ee 100644 --- a/src/graphics/engine/terrain.cpp +++ b/src/graphics/engine/terrain.cpp @@ -90,7 +90,7 @@ bool CTerrain::Generate(int mosaicCount, int brickCountPow2, float brickSize, std::vector(dim).swap(m_textures); dim = m_mosaicCount*m_mosaicCount; - std::vector(dim).swap(m_objRanks); + std::vector(dim, -1).swap(m_objRanks); return true; } @@ -258,6 +258,23 @@ TerrainRes CTerrain::GetResource(const Math::Vector &p) void CTerrain::FlushRelief() { m_relief.clear(); + m_resources.clear(); + m_textures.clear(); + + for (int objRank : m_objRanks) + { + if (objRank == -1) + continue; + + int baseObjRank = m_engine->GetObjectBaseRank(objRank); + + if (baseObjRank != -1) + m_engine->DeleteBaseObject(baseObjRank); + + m_engine->DeleteObject(objRank); + } + + m_objRanks.clear(); } /** diff --git a/src/graphics/engine/terrain.h b/src/graphics/engine/terrain.h index e2317c48..e6186917 100644 --- a/src/graphics/engine/terrain.h +++ b/src/graphics/engine/terrain.h @@ -239,7 +239,7 @@ public: //! Generates a level in the terrain bool GenerateMaterials(int *id, float min, float max, float slope, float freq, Math::Vector center, float radius); - //! Clears the relief data to zero + //! Clears the relief, resources and all other associated data void FlushRelief(); //! Load relief from image bool LoadRelief(const std::string& fileName, float scaleRelief, bool adjustBorder); diff --git a/src/object/robotmain.cpp b/src/object/robotmain.cpp index 1748c57b..6fe85d32 100644 --- a/src/object/robotmain.cpp +++ b/src/object/robotmain.cpp @@ -1104,6 +1104,7 @@ void CRobotMain::ChangePhase(Phase phase) ChangePause(false); FlushDisplayInfo(); m_engine->SetRankView(0); + m_terrain->FlushRelief(); m_engine->DeleteAllObjects(); Gfx::CModelManager::GetInstancePointer()->DeleteAllModelCopies(); m_engine->SetWaterAddColor(Gfx::Color(0.0f, 0.0f, 0.0f, 0.0f)); @@ -3842,9 +3843,9 @@ void CRobotMain::Convert() void CRobotMain::ScenePerso() { DeleteAllObjects(); // removes all the current 3D Scene + m_terrain->FlushRelief(); m_engine->DeleteAllObjects(); Gfx::CModelManager::GetInstancePointer()->DeleteAllModelCopies(); - m_terrain->FlushRelief(); // all flat m_terrain->FlushBuildingLevel(); m_terrain->FlushFlyingLimit(); m_lightMan->FlushLights();