From 06f328207fa0a3e606992d3569b061b335eb0f48 Mon Sep 17 00:00:00 2001 From: Loic Blot Date: Wed, 4 Mar 2015 16:58:04 +0100 Subject: [PATCH] ABMHandler and player_collisions use sequential read/write. Switch from std::list to std::vector * Also remove dead code Map::unloadUnusedData which is dead since a long time --- src/environment.cpp | 18 ++++++------- src/environment.h | 2 +- src/localplayer.cpp | 7 +++-- src/localplayer.h | 2 +- src/map.cpp | 66 +++------------------------------------------ src/map.h | 12 +-------- 6 files changed, 18 insertions(+), 89 deletions(-) diff --git a/src/environment.cpp b/src/environment.cpp index 217d50fd5..0a3d36019 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -382,7 +382,7 @@ ServerEnvironment::~ServerEnvironment() m_map->drop(); // Delete ActiveBlockModifiers - for(std::list::iterator + for(std::vector::iterator i = m_abms.begin(); i != m_abms.end(); ++i){ delete i->abm; } @@ -560,7 +560,7 @@ private: ServerEnvironment *m_env; std::map > m_aabms; public: - ABMHandler(std::list &abms, + ABMHandler(std::vector &abms, float dtime_s, ServerEnvironment *env, bool use_timers): m_env(env) @@ -568,8 +568,8 @@ public: if(dtime_s < 0.001) return; INodeDefManager *ndef = env->getGameDef()->ndef(); - for(std::list::iterator - i = abms.begin(); i != abms.end(); ++i){ + for(std::vector::iterator + i = abms.begin(); i != abms.end(); ++i) { ActiveBlockModifier *abm = i->abm; float trigger_interval = abm->getTriggerInterval(); if(trigger_interval < 0.001) @@ -1182,7 +1182,7 @@ void ServerEnvironment::step(float dtime) <<") being handled"<getBlockNoCreateNoEx(p); - if(block==NULL) + if(block == NULL) continue; // Set current time as timestamp @@ -2081,7 +2081,7 @@ void ClientEnvironment::step(float dtime) LocalPlayer *lplayer = getLocalPlayer(); assert(lplayer); // collision info queue - std::list player_collisions; + std::vector player_collisions; /* Get the speed the player is going @@ -2196,10 +2196,8 @@ void ClientEnvironment::step(float dtime) //std::cout<<"Looped "<::iterator - i = player_collisions.begin(); - i != player_collisions.end(); ++i) - { + for(std::vector::iterator i = player_collisions.begin(); + i != player_collisions.end(); ++i) { CollisionInfo &info = *i; v3f speed_diff = info.new_speed - info.old_speed;; // Handle only fall damage diff --git a/src/environment.h b/src/environment.h index 761e9068b..386289307 100644 --- a/src/environment.h +++ b/src/environment.h @@ -393,7 +393,7 @@ private: u32 m_game_time; // A helper variable for incrementing the latter float m_game_time_fraction_counter; - std::list m_abms; + std::vector m_abms; // An interval for generally sending object positions and stuff float m_recommended_send_interval; // Estimate for general maximum lag as determined by server. diff --git a/src/localplayer.cpp b/src/localplayer.cpp index 69d4ec7ef..cb183947a 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -67,7 +67,7 @@ LocalPlayer::~LocalPlayer() } void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, - std::list *collision_info) + std::vector *collision_info) { Map *map = &env->getMap(); INodeDefManager *nodemgr = m_gamedef->ndef(); @@ -323,9 +323,8 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, */ bool bouncy_jump = false; // Dont report if flying - if(collision_info && !(g_settings->getBool("free_move") && fly_allowed)) - { - for(size_t i=0; igetBool("free_move") && fly_allowed)) { + for(size_t i=0; ipush_back(info); if(info.new_speed.Y - info.old_speed.Y > 0.1*BS && diff --git a/src/localplayer.h b/src/localplayer.h index 16b66716d..2a4a9dfc7 100644 --- a/src/localplayer.h +++ b/src/localplayer.h @@ -48,7 +48,7 @@ public: void move(f32 dtime, Environment *env, f32 pos_max_d); void move(f32 dtime, Environment *env, f32 pos_max_d, - std::list *collision_info); + std::vector *collision_info); void applyControl(float dtime); diff --git a/src/map.cpp b/src/map.cpp index a9ff22c32..2c7028009 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -1428,7 +1428,7 @@ void Map::timerUpdate(float dtime, float unload_timeout, // Profile modified reasons Profiler modprofiler; - std::list sector_deletion_queue; + std::vector sector_deletion_queue; u32 deleted_blocks_count = 0; u32 saved_blocks_count = 0; u32 block_count_all = 0; @@ -1505,11 +1505,10 @@ void Map::unloadUnreferencedBlocks(std::vector *unloaded_blocks) timerUpdate(0.0, -1.0, unloaded_blocks); } -void Map::deleteSectors(std::list &list) +void Map::deleteSectors(std::vector §orList) { - for(std::list::iterator j = list.begin(); - j != list.end(); ++j) - { + for(std::vector::iterator j = sectorList.begin(); + j != sectorList.end(); ++j) { MapSector *sector = m_sectors[*j]; // If sector is in sector cache, remove it from there if(m_sector_cache == sector) @@ -1520,63 +1519,6 @@ void Map::deleteSectors(std::list &list) } } -#if 0 -void Map::unloadUnusedData(float timeout, - core::list *deleted_blocks) -{ - core::list sector_deletion_queue; - u32 deleted_blocks_count = 0; - u32 saved_blocks_count = 0; - - core::map::Iterator si = m_sectors.getIterator(); - for(; si.atEnd() == false; si++) - { - MapSector *sector = si.getNode()->getValue(); - - bool all_blocks_deleted = true; - - core::list blocks; - sector->getBlocks(blocks); - for(core::list::Iterator i = blocks.begin(); - i != blocks.end(); i++) - { - MapBlock *block = (*i); - - if(block->getUsageTimer() > timeout) - { - // Save if modified - if(block->getModified() != MOD_STATE_CLEAN) - { - saveBlock(block); - saved_blocks_count++; - } - // Delete from memory - sector->deleteBlock(block); - deleted_blocks_count++; - } - else - { - all_blocks_deleted = false; - } - } - - if(all_blocks_deleted) - { - sector_deletion_queue.push_back(si.getNode()->getKey()); - } - } - - deleteSectors(sector_deletion_queue); - - infostream<<"Map: Unloaded "< &list); - -#if 0 - /* - Unload unused data - = flush changed to disk and delete from memory, if usage timer of - block is more than timeout - */ - void unloadUnusedData(float timeout, - core::list *deleted_blocks=NULL); -#endif + void deleteSectors(std::vector &list); // For debug printing. Prints "Map: ", "ServerMap: " or "ClientMap: " virtual void PrintInfo(std::ostream &out); -- 2.25.1