Collapse gamesave to save space in memory
This commit is contained in:
parent
385552ceab
commit
aa774771a0
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Reference in New Issue
Block a user