commit all my pending perf improvements,

...there is too much stuff lying around I need to save all that
This commit is contained in:
Jérémy Rosen 2009-05-16 17:50:19 +00:00
parent 4c44213f06
commit d1c262e428
4 changed files with 79 additions and 47 deletions

View file

@ -2076,29 +2076,15 @@ bool unit::invalidate(const map_location &loc)
const gamemap & map = disp->get_map();
const t_translation::t_terrain terrain = map.get_terrain(loc);
const terrain_type& terrain_info = map.get_terrain_info(terrain);
if(!params.submerge) params.submerge= is_flying() ? 0.0 : terrain_info.unit_submerge();
if(invisible(loc,disp->get_units(),disp->get_teams()) &&
params.highlight_ratio > 0.5) {
params.highlight_ratio = 0.5;
}
if(loc == disp->selected_hex() && params.highlight_ratio == 1.0) {
params.highlight_ratio = 1.5;
}
int height_adjust = static_cast<int>(terrain_info.unit_height_adjust() * disp->get_zoom_factor());
if (is_flying() && height_adjust < 0) {
height_adjust = 0;
}
params.y -= height_adjust;
params.halo_y -= height_adjust;
if (get_state(STATE_POISONED) ){
params.blend_with = disp->rgb(0,255,0);
params.blend_ratio = 0.25;
}
params.image_mod = image_mods();
//get_animation()->update_last_draw_time();
frame_parameters adjusted_params= get_animation()->get_current_params(params);
result |= get_animation()->invalidate(params);
}
@ -3020,22 +3006,6 @@ unit& unit::clone(bool is_temporary)
return *this;
}
void unit::refresh(const game_display &disp,const map_location &loc)
{
if (state_ == STATE_FORGET && anim_ && anim_->animation_finished_potential()) {
set_standing(loc);
return;
}
if (state_ != STATE_STANDING || get_current_animation_tick() < next_idling_
|| incapacitated())
return;
if (get_current_animation_tick() > next_idling_ + 1000) {
// prevent all units animating at the same time
set_standing(loc);
} else {
set_idling(disp, loc);
}
}
unit_movement_resetter::unit_movement_resetter(unit &u, bool operate) :
u_(u), moves_(u.movement_)

View file

@ -26,8 +26,8 @@
#include "unit_types.hpp"
#include "unit_map.hpp"
#include "variable.hpp"
#include "game_display.hpp"
class game_display;
class gamestatus;
class game_state;
class config_writer;
@ -145,7 +145,25 @@ public:
void end_turn();
void new_scenario();
/** Called on every draw */
void refresh(const game_display& disp,const map_location& loc);
void refresh(const game_display& disp,const map_location& loc) {
if (state_ != STATE_STANDING || get_current_animation_tick() < next_idling_ || incapacitated())
return;
if (state_ == STATE_FORGET && anim_ && anim_->animation_finished_potential()) {
set_standing(loc);
return;
}
if (get_current_animation_tick() > next_idling_ + 1000) {
// prevent all units animating at the same time
if (disp.idle_anim()) {
next_idling_ = get_current_animation_tick()
+ static_cast<int>((20000 + rand() % 20000) * disp.idle_anim_rate());
} else {
next_idling_ = INT_MAX;
}
} else {
set_idling(disp, loc);
}
}
bool take_hit(int damage) { hit_points_ -= damage; return hit_points_ <= 0; }
void heal(int amount);

View file

@ -130,6 +130,7 @@ unit_animation::unit_animation(int start_time,
src_(),
dst_(),
invalidated_(false),
play_offscreen_(true),
overlaped_hex_()
{
add_frame(frame.duration(),frame,!frame.does_not_change());
@ -151,7 +152,10 @@ unit_animation::unit_animation(const config& cfg,const std::string frame_string
sub_anims_(),
unit_anim_(cfg,frame_string),
src_(),
dst_()
dst_(),
invalidated_(false),
play_offscreen_(true),
overlaped_hex_()
{
// if(!cfg["debug"].empty()) printf("DEBUG WML: FINAL\n%s\n\n",cfg.debug().c_str());
foreach (const config::any_child &fr, cfg.all_children_range())
@ -207,6 +211,7 @@ unit_animation::unit_animation(const config& cfg,const std::string frame_string
foreach (const config &filter, cfg.child_range("filter_second_attack")) {
secondary_attack_filter_.push_back(filter);
}
play_offscreen_=utils::string_bool(cfg["offscreen"],true);
}
@ -333,6 +338,7 @@ void unit_animation::fill_initial_animations( std::vector<unit_animation> & anim
tmp_anim = *itor;
tmp_anim.event_ = utils::split("standing");
tmp_anim.play_offscreen_ = false;
animations.push_back(tmp_anim);
tmp_anim = *itor;
@ -477,6 +483,7 @@ void unit_animation::add_anims( std::vector<unit_animation> & animations, const
foreach (config &anim, expanded_cfg.child_range("standing_anim"))
{
anim["apply_to"] = "standing,default";
if (anim["offscreen"].empty()) anim["offscreen"] = "no";
if (anim["layer"].empty()) anim["layer"] = default_layer;
animations.push_back(unit_animation(anim));
}
@ -485,6 +492,7 @@ void unit_animation::add_anims( std::vector<unit_animation> & animations, const
foreach (config &anim, expanded_cfg.child_range("idle_anim"))
{
anim["apply_to"] = "idling";
if (anim["offscreen"].empty()) anim["offscreen"] = "no";
if (anim["layer"].empty()) anim["layer"] = default_layer;
animations.push_back(unit_animation(anim));
}
@ -680,6 +688,14 @@ bool unit_animation::particule::need_update() const
return false;
}
bool unit_animation::particule::need_minimal_update() const
{
if(get_current_frame_begin_time() != last_frame_begin_time_ ) {
return true;
}
return false;
}
unit_animation::particule::particule(
const config& cfg, const std::string frame_string ) :
animated<unit_frame>(),
@ -719,6 +735,19 @@ bool unit_animation::need_update() const
return false;
}
bool unit_animation::need_minimal_update() const
{
if(!play_offscreen_) {
return false;
}
if(unit_anim_.need_minimal_update()) return true;
std::map<std::string,particule>::const_iterator anim_itor =sub_anims_.begin();
for( /*null*/; anim_itor != sub_anims_.end() ; anim_itor++) {
if(anim_itor->second.need_minimal_update()) return true;
}
return false;
}
bool unit_animation::animation_finished() const
{
if(!unit_anim_.animation_finished()) return false;
@ -826,24 +855,33 @@ bool unit_animation::invalidate(const frame_parameters& value)
{
if(invalidated_) return false;
game_display*disp = game_display::get_singleton();
bool complete_redraw =disp->tile_nearly_on_screen(src_) || disp->tile_nearly_on_screen(dst_);
if(overlaped_hex_.empty()) {
std::map<std::string,particule>::iterator anim_itor =sub_anims_.begin();
overlaped_hex_ = unit_anim_.get_overlaped_hex(value,src_,dst_,true);
for( /*null*/; anim_itor != sub_anims_.end() ; anim_itor++) {
std::set<map_location> tmp = anim_itor->second.get_overlaped_hex(value,src_,dst_,true);
overlaped_hex_.insert(tmp.begin(),tmp.end());
if(complete_redraw) {
std::map<std::string,particule>::iterator anim_itor =sub_anims_.begin();
overlaped_hex_ = unit_anim_.get_overlaped_hex(value,src_,dst_,true);
for( /*null*/; anim_itor != sub_anims_.end() ; anim_itor++) {
std::set<map_location> tmp = anim_itor->second.get_overlaped_hex(value,src_,dst_,true);
overlaped_hex_.insert(tmp.begin(),tmp.end());
}
} else {
// off screen animations only invalidate their own hex, no propagation,
// but we stil need this to play sounds
overlaped_hex_.insert(src_);
}
}
if(need_update() ) {
disp->invalidate(overlaped_hex_);
invalidated_ = true;
return true;
if(complete_redraw) {
if( need_update()) {
disp->invalidate(overlaped_hex_);
invalidated_ = true;
return true;
} else {
invalidated_ = disp->propagate_invalidation(overlaped_hex_);
return invalidated_;
}
} else {
std::vector<map_location> intersection;
set_intersection(overlaped_hex_.begin(),overlaped_hex_.end(),
disp->get_invalidated().begin(),disp->get_invalidated().end(),
std::back_inserter(intersection));
if(!intersection.empty()) {
if(need_minimal_update()) {
disp->invalidate(overlaped_hex_);
invalidated_ = true;
return true;
@ -852,6 +890,9 @@ bool unit_animation::invalidate(const frame_parameters& value)
}
}
}
void unit_animation::particule::redraw(const frame_parameters& value,const map_location &src, const map_location &dst, const bool primary)
{
const unit_frame& current_frame= get_current_frame();

View file

@ -47,6 +47,7 @@ class unit_animation
void add_frame(int duration, const unit_frame& value,bool force_change =false){ unit_anim_.add_frame(duration,value,force_change) ; };
bool need_update() const;
bool need_minimal_update() const;
bool animation_finished() const;
bool animation_finished_potential() const;
void update_last_draw_time();
@ -84,6 +85,7 @@ class unit_animation
explicit particule(const config& cfg,const std::string frame_string ="frame");
virtual ~particule();
bool need_update() const;
bool need_minimal_update() const;
void override(int start_time,int duration, const std::string highlight="", const std::string blend_ratio ="",Uint32 blend_color = 0,const std::string offset="",const std::string layer="");
void redraw( const frame_parameters& value,const map_location &src, const map_location &dst, const bool primary=false);
std::set<map_location> get_overlaped_hex(const frame_parameters& value,const map_location &src, const map_location &dst, const bool primary = false);
@ -117,6 +119,7 @@ class unit_animation
map_location dst_;
// optimisation
bool invalidated_;
bool play_offscreen_;
std::set<map_location> overlaped_hex_;
};