Optimize the fogging of the minimap:

The darkening of a fogged mini-tile was done in real-time for each one
and take ~80% of the rendering time. So, now use a small cache (few
8x8 tiles) for the fogged version (like we already do for the unfogged
one).

Much faster but probably noticable only on big map and/or slow CPU.
This commit is contained in:
Ali El Gariani 2007-09-17 11:33:52 +00:00
parent d487834ecd
commit 288001b625
3 changed files with 20 additions and 6 deletions

View file

@ -83,6 +83,7 @@ void reset_cache(std::vector<image::cache_item<T> >& cache)
namespace image {
mini_terrain_cache_map mini_terrain_cache;
mini_terrain_cache_map mini_fogged_terrain_cache;
void flush_cache()
{
@ -94,6 +95,7 @@ void flush_cache()
reset_cache(brightened_images_);
reset_cache(semi_brightened_images_);
mini_terrain_cache.clear();
mini_fogged_terrain_cache.clear();
reversed_images_.clear();
image_existance_map.clear();
}

View file

@ -147,6 +147,7 @@ namespace image {
typedef std::vector<cache_item<locator> > locator_cache;
typedef std::map<t_translation::t_letter, surface> mini_terrain_cache_map;
extern mini_terrain_cache_map mini_terrain_cache;
extern mini_terrain_cache_map mini_fogged_terrain_cache;
void flush_cache();

View file

@ -48,6 +48,7 @@ surface getMinimap(int w, int h, const gamemap& map, const viewpoint* vw)
typedef mini_terrain_cache_map cache_map;
cache_map& cache = mini_terrain_cache;
cache_map& fog_cache = mini_fogged_terrain_cache;
for(int y = 0; y != map.h(); ++y) {
for(int x = 0; x != map.w(); ++x) {
@ -59,7 +60,17 @@ surface getMinimap(int w, int h, const gamemap& map, const viewpoint* vw)
const bool shrouded = vw != NULL && vw->shrouded(x,y);
const bool fogged = vw != NULL && vw->fogged(x,y) && !shrouded;
const t_translation::t_letter terrain = shrouded ? t_translation::VOID_TERRAIN : map[x][y];
cache_map::iterator i = cache.find(terrain);
cache_map::iterator i;
bool need_fogging = false;
if (fogged) {
i = fog_cache.find(terrain);
}
if (!fogged || i == fog_cache.end()) {
i = cache.find(terrain);
need_fogging = fogged;
}
if(i == cache.end()) {
surface tile(get_image("terrain/" + map.get_terrain_info(terrain).minimap_image() + ".png",image::HEXED));
@ -75,14 +86,14 @@ surface getMinimap(int w, int h, const gamemap& map, const viewpoint* vw)
if(surf == NULL) {
continue;
}
i = cache.insert(cache_map::value_type(terrain,surf)).first;
} else {
surf = surface(i->second);
i = mini_terrain_cache.insert(cache_map::value_type(terrain,surf)).first;
}
if(fogged) {
surf = i->second;
if (need_fogging) {
surf = surface(adjust_surface_colour(surf,-50,-50,-50));
mini_fogged_terrain_cache.insert(cache_map::value_type(terrain,surf));
}
wassert(surf != NULL);