Browse Source

* faster and less memory-consuming def handling
* minor leak in battle interface fixed

mateuszb 16 năm trước cách đây
mục cha
commit
d5ba0fc4fb

+ 1 - 0
client/CBattleInterface.cpp

@@ -227,6 +227,7 @@ void CSpellEffectAnim::endAnim()
 
 	for(int b=0; b<toDel.size(); ++b)
 	{
+		delete toDel[b]->anim;
 		owner->battleEffects.erase(toDel[b]);
 	}
 

+ 2 - 5
client/CCreatureAnimation.cpp

@@ -36,7 +36,7 @@ void CCreatureAnimation::setType(int type)
 	}
 }
 
-CCreatureAnimation::CCreatureAnimation(std::string name) : RLEntries(NULL), internalFrame(0), once(false)
+CCreatureAnimation::CCreatureAnimation(std::string name) : internalFrame(0), once(false)
 {
 	FDef = spriteh->giveFile(name); //load main file
 
@@ -91,7 +91,6 @@ CCreatureAnimation::CCreatureAnimation(std::string name) : RLEntries(NULL), inte
 	curFrame = 0;
 	type = -1;
 	frames = totalEntries;
-	RLEntries = new int[fullHeight];
 }
 
 int CCreatureAnimation::readNormalNr (int pos, int bytCon, unsigned char * str) const
@@ -207,7 +206,7 @@ int CCreatureAnimation::nextFrame(SDL_Surface *dest, int x, int y, bool attacker
 		{
 			ftcp+=FullWidth * TopMargin;
 		}
-		memcpy(RLEntries, FDef+BaseOffset, SpriteHeight*sizeof(int));
+		int * RLEntries = (int*)(FDef+BaseOffset);
 		BaseOffset += sizeof(int) * SpriteHeight;
 		for (int i=0;i<SpriteHeight;i++)
 		{
@@ -280,8 +279,6 @@ int CCreatureAnimation::framesInGroup(int group) const
 CCreatureAnimation::~CCreatureAnimation()
 {
 	delete [] FDef;
-	if (RLEntries)
-		delete [] RLEntries;
 }
 
 inline void CCreatureAnimation::putPixel(

+ 0 - 1
client/CCreatureAnimation.h

@@ -22,7 +22,6 @@ private:
 	int totalEntries, DEFType, totalBlocks;
 	int length;
 	BMPPalette palette[256];
-	int * RLEntries;
 	struct SEntry
 	{
 		int offset;

+ 12 - 17
hch/CDefHandler.cpp

@@ -26,15 +26,12 @@ static long long pow(long long a, int b)
 CDefHandler::CDefHandler()
 {
 	//FDef = NULL;
-	RWEntries = NULL;
 	notFreeImgs = false;
 }
 CDefHandler::~CDefHandler()
 {
 	//if (FDef)
 		//delete [] FDef;
-	if (RWEntries)
-		delete [] RWEntries;
 	if (notFreeImgs)
 		return;
 	for (size_t i=0; i<ourImages.size(); ++i)
@@ -184,7 +181,7 @@ void CDefHandler::openFromMemory(unsigned char *table, std::string name)
 	{
 		SEntries[j].name = SEntries[j].name.substr(0, SEntries[j].name.find('.')+4);
 	}
-	RWEntries = new unsigned int[height];
+	//RWEntries = new unsigned int[height];
 	for(size_t i=0; i < SEntries.size(); ++i)
 	{
 		Cimage nimg;
@@ -339,11 +336,11 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet
 
 	case 1:
 	{
-		memcpy(RWEntries, FDef+BaseOffset, SpriteHeight*sizeof(int));
+		unsigned int * RWEntriesLoc = (unsigned int *)(FDef+BaseOffset);
 		BaseOffset += sizeof(int) * SpriteHeight;
 		for (int i=0;i<SpriteHeight;i++)
 		{
-			BaseOffset=BaseOffsetor+RWEntries[i];
+			BaseOffset=BaseOffsetor+RWEntriesLoc[i];
 			if (LeftMargin>0)
 				ftcp += LeftMargin;
 
@@ -357,7 +354,7 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet
 
 				if (SegmentType==0xFF)
 				{
-					for (int k=0;k<SegmentLength;k++)
+					for (int k=0; k<SegmentLength;k++)
 					{
 						((char*)(ret->pixels))[ftcp++]=FDef[BaseOffset+k];
 						if ((TotalRowLength+k)>=SpriteWidth)
@@ -387,12 +384,11 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet
 
 	case 2:
 	{
-		for (int i=0;i<SpriteHeight;i++)
+		/*for (int i=0;i<SpriteHeight;i++)
 		{
-			BaseOffset=BaseOffsetor+i*2*(SpriteWidth/32);
-			RWEntries[i] = readNormalNr(BaseOffset,2,FDef);
-		}
-		BaseOffset = BaseOffsetor+RWEntries[0];
+			RWEntries[i] = readNormalNr(BaseOffsetor+i*2*(SpriteWidth/32), 2, FDef);
+		}*/
+		BaseOffset = BaseOffsetor + *(unsigned short*)( FDef + BaseOffsetor ); //was + RWEntries[0];
 		for (int i=0;i<SpriteHeight;i++)
 		{
 			//BaseOffset = BaseOffsetor+RWEntries[i];
@@ -433,14 +429,13 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, unsigned char * FDef, BMPPalet
 
 	case 3:
 	{
-		for (int i=0;i<SpriteHeight;i++)
+		/*for (int i=0;i<SpriteHeight;i++)
 		{
-			BaseOffset=BaseOffsetor+i*2*(SpriteWidth/32);
-			RWEntries[i] = readNormalNr(BaseOffset,2,FDef);
-		}
+			RWEntries[i] = readNormalNr(BaseOffsetor+i*2*(SpriteWidth/32), 2, FDef);
+		}*/
 		for (int i=0;i<SpriteHeight;i++)
 		{
-			BaseOffset = BaseOffsetor+RWEntries[i];
+			BaseOffset = BaseOffsetor + *(unsigned short*)( FDef + BaseOffsetor+i*2*(SpriteWidth/32) ); //was + RWEntries[i] before speedup
 			if (LeftMargin>0)
 				ftcp += LeftMargin;
 

+ 1 - 1
hch/CDefHandler.h

@@ -28,7 +28,7 @@ private:
 	int totalEntries, DEFType, totalBlocks;
 	bool allowRepaint;
 	int length;
-	unsigned int * RWEntries;
+	//unsigned int * RWEntries;
 	struct SEntry
 	{
 		std::string name;