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
This commit is contained in:
Loic Blot 2015-03-04 16:58:04 +01:00
parent 2066655aae
commit 06f328207f
6 changed files with 18 additions and 89 deletions

@ -382,7 +382,7 @@ ServerEnvironment::~ServerEnvironment()
m_map->drop(); m_map->drop();
// Delete ActiveBlockModifiers // Delete ActiveBlockModifiers
for(std::list<ABMWithState>::iterator for(std::vector<ABMWithState>::iterator
i = m_abms.begin(); i != m_abms.end(); ++i){ i = m_abms.begin(); i != m_abms.end(); ++i){
delete i->abm; delete i->abm;
} }
@ -560,7 +560,7 @@ private:
ServerEnvironment *m_env; ServerEnvironment *m_env;
std::map<content_t, std::vector<ActiveABM> > m_aabms; std::map<content_t, std::vector<ActiveABM> > m_aabms;
public: public:
ABMHandler(std::list<ABMWithState> &abms, ABMHandler(std::vector<ABMWithState> &abms,
float dtime_s, ServerEnvironment *env, float dtime_s, ServerEnvironment *env,
bool use_timers): bool use_timers):
m_env(env) m_env(env)
@ -568,7 +568,7 @@ public:
if(dtime_s < 0.001) if(dtime_s < 0.001)
return; return;
INodeDefManager *ndef = env->getGameDef()->ndef(); INodeDefManager *ndef = env->getGameDef()->ndef();
for(std::list<ABMWithState>::iterator for(std::vector<ABMWithState>::iterator
i = abms.begin(); i != abms.end(); ++i) { i = abms.begin(); i != abms.end(); ++i) {
ActiveBlockModifier *abm = i->abm; ActiveBlockModifier *abm = i->abm;
float trigger_interval = abm->getTriggerInterval(); float trigger_interval = abm->getTriggerInterval();
@ -2081,7 +2081,7 @@ void ClientEnvironment::step(float dtime)
LocalPlayer *lplayer = getLocalPlayer(); LocalPlayer *lplayer = getLocalPlayer();
assert(lplayer); assert(lplayer);
// collision info queue // collision info queue
std::list<CollisionInfo> player_collisions; std::vector<CollisionInfo> player_collisions;
/* /*
Get the speed the player is going Get the speed the player is going
@ -2196,10 +2196,8 @@ void ClientEnvironment::step(float dtime)
//std::cout<<"Looped "<<loopcount<<" times."<<std::endl; //std::cout<<"Looped "<<loopcount<<" times."<<std::endl;
for(std::list<CollisionInfo>::iterator for(std::vector<CollisionInfo>::iterator i = player_collisions.begin();
i = player_collisions.begin(); i != player_collisions.end(); ++i) {
i != player_collisions.end(); ++i)
{
CollisionInfo &info = *i; CollisionInfo &info = *i;
v3f speed_diff = info.new_speed - info.old_speed;; v3f speed_diff = info.new_speed - info.old_speed;;
// Handle only fall damage // Handle only fall damage

@ -393,7 +393,7 @@ private:
u32 m_game_time; u32 m_game_time;
// A helper variable for incrementing the latter // A helper variable for incrementing the latter
float m_game_time_fraction_counter; float m_game_time_fraction_counter;
std::list<ABMWithState> m_abms; std::vector<ABMWithState> m_abms;
// An interval for generally sending object positions and stuff // An interval for generally sending object positions and stuff
float m_recommended_send_interval; float m_recommended_send_interval;
// Estimate for general maximum lag as determined by server. // Estimate for general maximum lag as determined by server.

@ -67,7 +67,7 @@ LocalPlayer::~LocalPlayer()
} }
void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d,
std::list<CollisionInfo> *collision_info) std::vector<CollisionInfo> *collision_info)
{ {
Map *map = &env->getMap(); Map *map = &env->getMap();
INodeDefManager *nodemgr = m_gamedef->ndef(); INodeDefManager *nodemgr = m_gamedef->ndef();
@ -323,8 +323,7 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d,
*/ */
bool bouncy_jump = false; bool bouncy_jump = false;
// Dont report if flying // Dont report if flying
if(collision_info && !(g_settings->getBool("free_move") && fly_allowed)) if(collision_info && !(g_settings->getBool("free_move") && fly_allowed)) {
{
for(size_t i=0; i<result.collisions.size(); i++) { for(size_t i=0; i<result.collisions.size(); i++) {
const CollisionInfo &info = result.collisions[i]; const CollisionInfo &info = result.collisions[i];
collision_info->push_back(info); collision_info->push_back(info);

@ -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);
void move(f32 dtime, Environment *env, f32 pos_max_d, void move(f32 dtime, Environment *env, f32 pos_max_d,
std::list<CollisionInfo> *collision_info); std::vector<CollisionInfo> *collision_info);
void applyControl(float dtime); void applyControl(float dtime);

@ -1428,7 +1428,7 @@ void Map::timerUpdate(float dtime, float unload_timeout,
// Profile modified reasons // Profile modified reasons
Profiler modprofiler; Profiler modprofiler;
std::list<v2s16> sector_deletion_queue; std::vector<v2s16> sector_deletion_queue;
u32 deleted_blocks_count = 0; u32 deleted_blocks_count = 0;
u32 saved_blocks_count = 0; u32 saved_blocks_count = 0;
u32 block_count_all = 0; u32 block_count_all = 0;
@ -1505,11 +1505,10 @@ void Map::unloadUnreferencedBlocks(std::vector<v3s16> *unloaded_blocks)
timerUpdate(0.0, -1.0, unloaded_blocks); timerUpdate(0.0, -1.0, unloaded_blocks);
} }
void Map::deleteSectors(std::list<v2s16> &list) void Map::deleteSectors(std::vector<v2s16> &sectorList)
{
for(std::list<v2s16>::iterator j = list.begin();
j != list.end(); ++j)
{ {
for(std::vector<v2s16>::iterator j = sectorList.begin();
j != sectorList.end(); ++j) {
MapSector *sector = m_sectors[*j]; MapSector *sector = m_sectors[*j];
// If sector is in sector cache, remove it from there // If sector is in sector cache, remove it from there
if(m_sector_cache == sector) if(m_sector_cache == sector)
@ -1520,63 +1519,6 @@ void Map::deleteSectors(std::list<v2s16> &list)
} }
} }
#if 0
void Map::unloadUnusedData(float timeout,
core::list<v3s16> *deleted_blocks)
{
core::list<v2s16> sector_deletion_queue;
u32 deleted_blocks_count = 0;
u32 saved_blocks_count = 0;
core::map<v2s16, MapSector*>::Iterator si = m_sectors.getIterator();
for(; si.atEnd() == false; si++)
{
MapSector *sector = si.getNode()->getValue();
bool all_blocks_deleted = true;
core::list<MapBlock*> blocks;
sector->getBlocks(blocks);
for(core::list<MapBlock*>::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 "<<deleted_blocks_count<<" blocks from memory"
<<", of which "<<saved_blocks_count<<" were wr."
<<std::endl;
//return sector_deletion_queue.getSize();
//return deleted_blocks_count;
}
#endif
void Map::PrintInfo(std::ostream &out) void Map::PrintInfo(std::ostream &out)
{ {
out<<"Map: "; out<<"Map: ";

@ -288,17 +288,7 @@ public:
// Deletes sectors and their blocks from memory // Deletes sectors and their blocks from memory
// Takes cache into account // Takes cache into account
// If deleted sector is in sector cache, clears cache // If deleted sector is in sector cache, clears cache
void deleteSectors(std::list<v2s16> &list); void deleteSectors(std::vector<v2s16> &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<v3s16> *deleted_blocks=NULL);
#endif
// For debug printing. Prints "Map: ", "ServerMap: " or "ClientMap: " // For debug printing. Prints "Map: ", "ServerMap: " or "ClientMap: "
virtual void PrintInfo(std::ostream &out); virtual void PrintInfo(std::ostream &out);