Fixed CTerrain-related memory leaks

dev-ui
Piotr Dziwinski 2013-10-13 14:44:12 +02:00
parent ccb63bd29e
commit 9017dbbbdb
4 changed files with 47 additions and 3 deletions

View File

@ -600,6 +600,31 @@ void CEngine::DeleteBaseObject(int baseObjRank)
void CEngine::DeleteAllBaseObjects()
{
for (int baseObjRank = 0; baseObjRank < static_cast<int>( m_baseObjects.size() ); baseObjRank++)
{
EngineBaseObject& p1 = m_baseObjects[baseObjRank];
if (! p1.used)
continue;
for (int l2 = 0; l2 < static_cast<int>( p1.next.size() ); l2++)
{
EngineBaseObjTexTier& p2 = p1.next[l2];
for (int l3 = 0; l3 < static_cast<int>( p2.next.size() ); l3++)
{
EngineBaseObjLODTier& p3 = p2.next[l3];
for (int l4 = 0; l4 < static_cast<int>( 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;

View File

@ -90,7 +90,7 @@ bool CTerrain::Generate(int mosaicCount, int brickCountPow2, float brickSize,
std::vector<int>(dim).swap(m_textures);
dim = m_mosaicCount*m_mosaicCount;
std::vector<int>(dim).swap(m_objRanks);
std::vector<int>(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();
}
/**

View File

@ -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);

View File

@ -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();