Browse Source

- fixed slow hero screen (not specific to it, but most notable here)
- fixed some bugs related to animation (cove buildings mostly)

Ivan Savenko 13 years ago
parent
commit
e695f1ad63
1 changed files with 51 additions and 6 deletions
  1. 51 6
      client/CAnimation.cpp

+ 51 - 6
client/CAnimation.cpp

@@ -68,6 +68,53 @@ public:
 	~CompImageLoader();
 };
 
+// Extremely simple file cache. TODO: smarter, more general solution
+class CFileCache
+{
+	static const int cacheSize = 50; //Max number of cached files
+	struct FileData
+	{
+		ResourceID name;
+		size_t size;
+		ui8 * data;
+
+		ui8 * getCopy()
+		{
+			ui8 * ret = new ui8[size];
+			std::copy(data, data + size, ret);
+			return ret;
+		}
+		~FileData()
+		{
+			delete data;
+		}
+	};
+
+	std::list<FileData> cache;
+public:
+	ui8 * getCachedFile(ResourceID && rid)
+	{
+		BOOST_FOREACH(auto & file, cache)
+		{
+			if (file.name == rid)
+				return file.getCopy();
+		}
+		// Still here? Cache miss
+		if (cache.size() > cacheSize)
+			cache.pop_front();
+		cache.push_back(FileData());
+
+		auto data =  CResourceHandler::get()->loadData(rid);
+		cache.back().name = ResourceID(rid);
+		cache.back().size = data.second;
+		cache.back().data = data.first.release();
+
+		return cache.back().getCopy();
+	}
+};
+
+static CFileCache animationCache;
+
 /*************************************************************************
  *  DefFile, class used for def loading                                  *
  *************************************************************************/
@@ -88,8 +135,7 @@ CDefFile::CDefFile(std::string Name):
 		{   0,   0,   0, 128},//  50% - shadow body   below selection
 		{   0,   0,   0, 192} // 75% - shadow border below selection
 	};
-	data = CResourceHandler::get()->loadData(
-	           ResourceID(std::string("SPRITES/") + Name, EResType::ANIMATION)).first.release();
+	data = animationCache.getCachedFile(ResourceID(std::string("SPRITES/") + Name, EResType::ANIMATION));
 
 	palette = new SDL_Color[256];
 	int it = 0;
@@ -109,8 +155,8 @@ CDefFile::CDefFile(std::string Name):
 		palette[i].b = data[it++];
 		palette[i].unused = 255;
 	}
-	if (type == 71)//Buttons/buildings don't have shadows\semi-transparency
-		memset(palette, 0, sizeof(SDL_Color)*8);
+	if (type == 71 || type == 64)//Buttons/buildings don't have shadows\semi-transparency
+		memset(palette, 0, sizeof(SDL_Color)*2);
 	else
 		memcpy(palette, H3Palette, sizeof(SDL_Color)*8);//initialize shadow\selection colors
 
@@ -414,7 +460,7 @@ inline void CompImageLoader::Load(size_t size, const ui8 * data)
 				while (runLength < size && color == data[runLength])
 					runLength++;
 
-				if (runLength > 1)//Row of one color found - use RLE
+				if (runLength > 1 && runLength < 255)//Row of one color found - use RLE
 				{
 					Load(runLength, color);
 					data += runLength;
@@ -485,7 +531,6 @@ inline void CompImageLoader::Load(size_t size, ui8 color)
 	if (entry && entry[0] == color)
 	{
 		size_t toCopy = std::min<size_t>(size, 255 - entry[1]);
-		entry[1] = 255;
 		size -= toCopy;
 		entry[1] += toCopy;
 	}