Replace std::list by std::vector into ClientMap::updateDrawList, Map::timerUpdate and ServerMap::save().

This will speedup the loop reading into those functions
master
Loic Blot 2015-02-17 15:28:49 +01:00
parent 3c91ad8fc2
commit fd70f4f2f0
5 changed files with 32 additions and 42 deletions

View File

@ -247,7 +247,7 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver)
continue; continue;
} }
std::list< MapBlock * > sectorblocks; MapBlockVect sectorblocks;
sector->getBlocks(sectorblocks); sector->getBlocks(sectorblocks);
/* /*
@ -256,8 +256,8 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver)
u32 sector_blocks_drawn = 0; u32 sector_blocks_drawn = 0;
std::list< MapBlock * >::iterator i; for(MapBlockVect::iterator i = sectorblocks.begin();
for(i=sectorblocks.begin(); i!=sectorblocks.end(); i++) i != sectorblocks.end(); i++)
{ {
MapBlock *block = *i; MapBlock *block = *i;

View File

@ -1440,23 +1440,20 @@ void Map::timerUpdate(float dtime, float unload_timeout,
bool all_blocks_deleted = true; bool all_blocks_deleted = true;
std::list<MapBlock*> blocks; MapBlockVect blocks;
sector->getBlocks(blocks); sector->getBlocks(blocks);
for(std::list<MapBlock*>::iterator i = blocks.begin(); for(MapBlockVect::iterator i = blocks.begin();
i != blocks.end(); ++i) i != blocks.end(); ++i) {
{
MapBlock *block = (*i); MapBlock *block = (*i);
block->incrementUsageTimer(dtime); block->incrementUsageTimer(dtime);
if(block->refGet() == 0 && block->getUsageTimer() > unload_timeout) if(block->refGet() == 0 && block->getUsageTimer() > unload_timeout) {
{
v3s16 p = block->getPos(); v3s16 p = block->getPos();
// Save if modified // Save if modified
if (block->getModified() != MOD_STATE_CLEAN && save_before_unloading) if (block->getModified() != MOD_STATE_CLEAN && save_before_unloading) {
{
modprofiler.add(block->getModifiedReason(), 1); modprofiler.add(block->getModifiedReason(), 1);
if (!saveBlock(block)) if (!saveBlock(block))
continue; continue;
@ -1471,15 +1468,13 @@ void Map::timerUpdate(float dtime, float unload_timeout,
deleted_blocks_count++; deleted_blocks_count++;
} }
else else {
{
all_blocks_deleted = false; all_blocks_deleted = false;
block_count_all++; block_count_all++;
} }
} }
if(all_blocks_deleted) if(all_blocks_deleted) {
{
sector_deletion_queue.push_back(si->first); sector_deletion_queue.push_back(si->first);
} }
} }
@ -2982,8 +2977,7 @@ std::string ServerMap::getBlockFilename(v3s16 p)
void ServerMap::save(ModifiedState save_level) void ServerMap::save(ModifiedState save_level)
{ {
DSTACK(__FUNCTION_NAME); DSTACK(__FUNCTION_NAME);
if(m_map_saving_enabled == false) if(m_map_saving_enabled == false) {
{
infostream<<"WARNING: Not saving map, saving disabled."<<std::endl; infostream<<"WARNING: Not saving map, saving disabled."<<std::endl;
return; return;
} }
@ -2992,8 +2986,7 @@ void ServerMap::save(ModifiedState save_level)
infostream<<"ServerMap: Saving whole map, this can take time." infostream<<"ServerMap: Saving whole map, this can take time."
<<std::endl; <<std::endl;
if(m_map_metadata_changed || save_level == MOD_STATE_CLEAN) if(m_map_metadata_changed || save_level == MOD_STATE_CLEAN) {
{
saveMapMeta(); saveMapMeta();
} }
@ -3008,30 +3001,27 @@ void ServerMap::save(ModifiedState save_level)
bool save_started = false; bool save_started = false;
for(std::map<v2s16, MapSector*>::iterator i = m_sectors.begin(); for(std::map<v2s16, MapSector*>::iterator i = m_sectors.begin();
i != m_sectors.end(); ++i) i != m_sectors.end(); ++i) {
{
ServerMapSector *sector = (ServerMapSector*)i->second; ServerMapSector *sector = (ServerMapSector*)i->second;
assert(sector->getId() == MAPSECTOR_SERVER); assert(sector->getId() == MAPSECTOR_SERVER);
if(sector->differs_from_disk || save_level == MOD_STATE_CLEAN) if(sector->differs_from_disk || save_level == MOD_STATE_CLEAN) {
{
saveSectorMeta(sector); saveSectorMeta(sector);
sector_meta_count++; sector_meta_count++;
} }
std::list<MapBlock*> blocks;
MapBlockVect blocks;
sector->getBlocks(blocks); sector->getBlocks(blocks);
for(std::list<MapBlock*>::iterator j = blocks.begin(); for(MapBlockVect::iterator j = blocks.begin();
j != blocks.end(); ++j) j != blocks.end(); ++j) {
{
MapBlock *block = *j; MapBlock *block = *j;
block_count_all++; block_count_all++;
if(block->getModified() >= (u32)save_level) if(block->getModified() >= (u32)save_level) {
{
// Lazy beginSave() // Lazy beginSave()
if(!save_started){ if(!save_started) {
beginSave(); beginSave();
save_started = true; save_started = true;
} }
@ -3049,6 +3039,7 @@ void ServerMap::save(ModifiedState save_level)
} }
} }
} }
if(save_started) if(save_started)
endSave(); endSave();
@ -3056,8 +3047,7 @@ void ServerMap::save(ModifiedState save_level)
Only print if something happened or saved whole map Only print if something happened or saved whole map
*/ */
if(save_level == MOD_STATE_CLEAN || sector_meta_count != 0 if(save_level == MOD_STATE_CLEAN || sector_meta_count != 0
|| block_count != 0) || block_count != 0) {
{
infostream<<"ServerMap: Written: " infostream<<"ServerMap: Written: "
<<sector_meta_count<<" sector metadata files, " <<sector_meta_count<<" sector metadata files, "
<<block_count<<" block files" <<block_count<<" block files"
@ -3085,14 +3075,12 @@ void ServerMap::listAllLoadedBlocks(std::vector<v3s16> &dst)
{ {
MapSector *sector = si->second; MapSector *sector = si->second;
std::list<MapBlock*> blocks; MapBlockVect blocks;
sector->getBlocks(blocks); sector->getBlocks(blocks);
for(std::list<MapBlock*>::iterator i = blocks.begin(); for(MapBlockVect::iterator i = blocks.begin();
i != blocks.end(); ++i) i != blocks.end(); ++i) {
{ v3s16 p = (*i)->getPos();
MapBlock *block = (*i);
v3s16 p = block->getPos();
dst.push_back(p); dst.push_back(p);
} }
} }

View File

@ -614,6 +614,8 @@ private:
int m_refcount; int m_refcount;
}; };
typedef std::vector<MapBlock*> MapBlockVect;
inline bool blockpos_over_limit(v3s16 p) inline bool blockpos_over_limit(v3s16 p)
{ {
return return

View File

@ -133,7 +133,7 @@ void MapSector::deleteBlock(MapBlock *block)
delete block; delete block;
} }
void MapSector::getBlocks(std::list<MapBlock*> &dest) void MapSector::getBlocks(MapBlockVect &dest)
{ {
for(std::map<s16, MapBlock*>::iterator bi = m_blocks.begin(); for(std::map<s16, MapBlock*>::iterator bi = m_blocks.begin();
bi != m_blocks.end(); ++bi) bi != m_blocks.end(); ++bi)

View File

@ -22,11 +22,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "irrlichttypes.h" #include "irrlichttypes.h"
#include "irr_v2d.h" #include "irr_v2d.h"
#include "mapblock.h"
#include <ostream> #include <ostream>
#include <map> #include <map>
#include <list> #include <vector>
class MapBlock;
class Map; class Map;
class IGameDef; class IGameDef;
@ -61,7 +61,7 @@ public:
void deleteBlock(MapBlock *block); void deleteBlock(MapBlock *block);
void getBlocks(std::list<MapBlock*> &dest); void getBlocks(MapBlockVect &dest);
// Always false at the moment, because sector contains no metadata. // Always false at the moment, because sector contains no metadata.
bool differs_from_disk; bool differs_from_disk;