ABM and liquid overload skip

This commit is contained in:
Perttu Ahola 2012-07-27 13:45:49 +03:00
parent 98ff4eb4ee
commit 1d44a98f2f
3 changed files with 11 additions and 3 deletions

@ -326,6 +326,7 @@ ServerEnvironment::ServerEnvironment(ServerMap *map, lua_State *L,
m_emerger(emerger), m_emerger(emerger),
m_random_spawn_timer(3), m_random_spawn_timer(3),
m_send_recommended_timer(0), m_send_recommended_timer(0),
m_active_block_interval_overload_skip(0),
m_game_time(0), m_game_time(0),
m_game_time_fraction_counter(0) m_game_time_fraction_counter(0)
{ {
@ -1095,7 +1096,12 @@ void ServerEnvironment::step(float dtime)
const float abm_interval = 1.0; const float abm_interval = 1.0;
if(m_active_block_modifier_interval.step(dtime, abm_interval)) if(m_active_block_modifier_interval.step(dtime, abm_interval))
{ do{ // breakable
if(m_active_block_interval_overload_skip > 0){
ScopeProfiler sp(g_profiler, "SEnv: ABM overload skips");
m_active_block_interval_overload_skip--;
break;
}
ScopeProfiler sp(g_profiler, "SEnv: modify in blocks avg /1s", SPT_AVG); ScopeProfiler sp(g_profiler, "SEnv: modify in blocks avg /1s", SPT_AVG);
TimeTaker timer("modify in active blocks"); TimeTaker timer("modify in active blocks");
@ -1128,8 +1134,9 @@ void ServerEnvironment::step(float dtime)
infostream<<"WARNING: active block modifiers took " infostream<<"WARNING: active block modifiers took "
<<time_ms<<"ms (longer than " <<time_ms<<"ms (longer than "
<<max_time_ms<<"ms)"<<std::endl; <<max_time_ms<<"ms)"<<std::endl;
m_active_block_interval_overload_skip = (time_ms / max_time_ms) + 1;
} }
} }while(0);
/* /*
Step script environment (run global on_step()) Step script environment (run global on_step())

@ -360,6 +360,7 @@ private:
IntervalLimiter m_active_blocks_management_interval; IntervalLimiter m_active_blocks_management_interval;
IntervalLimiter m_active_block_modifier_interval; IntervalLimiter m_active_block_modifier_interval;
IntervalLimiter m_active_blocks_nodemetadata_interval; IntervalLimiter m_active_blocks_nodemetadata_interval;
int m_active_block_interval_overload_skip;
// Time from the beginning of the game in seconds. // Time from the beginning of the game in seconds.
// Incremented in step(). // Incremented in step().
u32 m_game_time; u32 m_game_time;

@ -1636,7 +1636,7 @@ void Map::transformLiquids(core::map<v3s16, MapBlock*> & modified_blocks)
while(m_transforming_liquid.size() != 0) while(m_transforming_liquid.size() != 0)
{ {
// This should be done here so that it is done when continue is used // This should be done here so that it is done when continue is used
if(loopcount >= initial_size * 3) if(loopcount >= initial_size || loopcount >= 1000)
break; break;
loopcount++; loopcount++;