Collapse gamesave to save space in memory

This commit is contained in:
Simon Robertshaw 2012-07-28 02:23:21 +01:00
parent 385552ceab
commit aa774771a0
4 changed files with 118 additions and 16 deletions

View File

@ -25,7 +25,10 @@ gravityEnable(save.gravityEnable),
paused(save.paused), paused(save.paused),
gravityMode(save.gravityMode), gravityMode(save.gravityMode),
airMode(save.airMode), airMode(save.airMode),
signs(save.signs) signs(save.signs),
expanded(save.expanded),
hasOriginalData(save.hasOriginalData),
originalData(save.originalData)
{ {
blockMap = NULL; blockMap = NULL;
blockMapPtr = NULL; blockMapPtr = NULL;
@ -34,14 +37,21 @@ signs(save.signs)
fanVelY = NULL; fanVelY = NULL;
fanVelYPtr = NULL; fanVelYPtr = NULL;
particles = NULL; particles = NULL;
if(save.expanded)
{
setSize(save.blockWidth, save.blockHeight);
setSize(save.blockWidth, save.blockHeight); copy(save.particles, save.particles+NPART, particles);
copy(save.blockMapPtr, save.blockMapPtr+(blockHeight*blockWidth), blockMapPtr);
copy(save.fanVelXPtr, save.fanVelXPtr+(blockHeight*blockWidth), fanVelXPtr);
copy(save.fanVelYPtr, save.fanVelYPtr+(blockHeight*blockWidth), fanVelYPtr);
}
else
{
blockWidth = save.blockWidth;
blockHeight = save.blockHeight;
}
particlesCount = save.particlesCount; particlesCount = save.particlesCount;
copy(save.particles, save.particles+NPART, particles);
copy(save.blockMapPtr, save.blockMapPtr+(blockHeight*blockWidth), blockMapPtr);
copy(save.fanVelXPtr, save.fanVelXPtr+(blockHeight*blockWidth), fanVelXPtr);
copy(save.fanVelYPtr, save.fanVelYPtr+(blockHeight*blockWidth), fanVelYPtr);
} }
GameSave::GameSave(int width, int height) GameSave::GameSave(int width, int height)
@ -54,6 +64,8 @@ GameSave::GameSave(int width, int height)
fanVelYPtr = NULL; fanVelYPtr = NULL;
particles = NULL; particles = NULL;
hasOriginalData = false;
expanded = true;
setSize(width, height); setSize(width, height);
} }
@ -70,13 +82,20 @@ GameSave::GameSave(std::vector<char> data)
fanVelYPtr = NULL; fanVelYPtr = NULL;
particles = NULL; particles = NULL;
try{ expanded = false;
read(&data[0], data.size()); hasOriginalData = true;
} catch (ParseException& e) { originalData = data;
try
{
Expand();
}
catch(ParseException & e)
{
std::cout << e.what() << std::endl; std::cout << e.what() << std::endl;
this->~GameSave(); //Free any allocated memory this->~GameSave(); //Free any allocated memory
throw; throw;
} }
Collapse();
} }
GameSave::GameSave(std::vector<unsigned char> data) GameSave::GameSave(std::vector<unsigned char> data)
@ -92,13 +111,20 @@ GameSave::GameSave(std::vector<unsigned char> data)
fanVelYPtr = NULL; fanVelYPtr = NULL;
particles = NULL; particles = NULL;
try{ expanded = false;
read((char*)(&data[0]), data.size()); hasOriginalData = true;
} catch (ParseException& e) { originalData = std::vector<char>(data.begin(), data.end());
try
{
Expand();
}
catch(ParseException & e)
{
std::cout << e.what() << std::endl; std::cout << e.what() << std::endl;
this->~GameSave(); //Free any allocated memory this->~GameSave(); //Free any allocated memory
throw; throw;
} }
Collapse();
} }
GameSave::GameSave(char * data, int dataSize) GameSave::GameSave(char * data, int dataSize)
@ -114,13 +140,77 @@ GameSave::GameSave(char * data, int dataSize)
fanVelYPtr = NULL; fanVelYPtr = NULL;
particles = NULL; particles = NULL;
try{ expanded = true;
read(data, dataSize); hasOriginalData = true;
} catch (ParseException& e) { originalData = std::vector<char>(data, data+dataSize);
try
{
Expand();
}
catch(ParseException & e)
{
std::cout << e.what() << std::endl; std::cout << e.what() << std::endl;
this->~GameSave(); //Free any allocated memory this->~GameSave(); //Free any allocated memory
throw; throw;
} }
//Collapse();
}
bool GameSave::Collapsed()
{
return !expanded;
}
void GameSave::Expand()
{
if(hasOriginalData && !expanded)
{
expanded = true;
read(&originalData[0], originalData.size());
}
}
void GameSave::Collapse()
{
if(expanded && hasOriginalData)
{
expanded = false;
if(particles)
{
delete[] particles;
particles = NULL;
}
if(blockMap)
{
delete[] blockMap;
blockMap = NULL;
}
if(blockMapPtr)
{
delete[] blockMapPtr;
blockMapPtr = NULL;
}
if(fanVelX)
{
delete[] fanVelX;
fanVelX = NULL;
}
if(fanVelXPtr)
{
delete[] fanVelXPtr;
fanVelXPtr = NULL;
}
if(fanVelY)
{
delete[] fanVelY;
fanVelY = NULL;
}
if(fanVelYPtr)
{
delete[] fanVelYPtr;
fanVelYPtr = NULL;
}
}
} }
void GameSave::read(char * data, int dataSize) void GameSave::read(char * data, int dataSize)

View File

@ -66,6 +66,10 @@ public:
char * Serialise(int & dataSize); char * Serialise(int & dataSize);
void Transform(matrix2d transform, vector2d translate); void Transform(matrix2d transform, vector2d translate);
void Expand();
void Collapse();
bool Collapsed();
inline GameSave& operator << (Particle v) inline GameSave& operator << (Particle v)
{ {
if(particlesCount<NPART && v.type) if(particlesCount<NPART && v.type)
@ -83,10 +87,14 @@ public:
} }
private: private:
bool expanded;
bool hasOriginalData;
float * fanVelXPtr; float * fanVelXPtr;
float * fanVelYPtr; float * fanVelYPtr;
unsigned char * blockMapPtr; unsigned char * blockMapPtr;
std::vector<char> originalData;
void read(char * data, int dataSize); void read(char * data, int dataSize);
void readOPS(char * data, int dataLength); void readOPS(char * data, int dataLength);
void readPSv(char * data, int dataLength); void readPSv(char * data, int dataLength);

View File

@ -41,6 +41,7 @@ Thumbnail * SaveRenderer::Render(GameSave * save)
Thumbnail * tempThumb; Thumbnail * tempThumb;
width = save->blockWidth; width = save->blockWidth;
height = save->blockHeight; height = save->blockHeight;
bool doCollapse = save->Collapsed();
g->Acquire(); g->Acquire();
g->Clear(); g->Clear();
@ -112,6 +113,8 @@ Thumbnail * SaveRenderer::Render(GameSave * save)
free(pData); free(pData);
#endif #endif
} }
if(doCollapse)
save->Collapse();
g->Release(); g->Release();
return tempThumb; return tempThumb;
} }

View File

@ -21,6 +21,7 @@ int Simulation::Load(int fullX, int fullY, GameSave * save)
int blockX, blockY, x, y, r; int blockX, blockY, x, y, r;
if(!save) return 0; if(!save) return 0;
save->Expand();
//Align to blockMap //Align to blockMap
blockX = fullX/CELL; blockX = fullX/CELL;