Skip to content

Commit

Permalink
Replace std::list by std::vector into ClientMap::updateDrawList, Map:…
Browse files Browse the repository at this point in the history
…:timerUpdate and ServerMap::save().

This will speedup the loop reading into those functions
  • Loading branch information
nerzhul committed Feb 17, 2015
1 parent 3c91ad8 commit fd70f4f
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 42 deletions.
6 changes: 3 additions & 3 deletions src/clientmap.cpp
Expand Up @@ -247,7 +247,7 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver)
continue;
}

std::list< MapBlock * > sectorblocks;
MapBlockVect sectorblocks;
sector->getBlocks(sectorblocks);

/*
Expand All @@ -256,8 +256,8 @@ void ClientMap::updateDrawList(video::IVideoDriver* driver)

u32 sector_blocks_drawn = 0;

std::list< MapBlock * >::iterator i;
for(i=sectorblocks.begin(); i!=sectorblocks.end(); i++)
for(MapBlockVect::iterator i = sectorblocks.begin();
i != sectorblocks.end(); i++)
{
MapBlock *block = *i;

Expand Down
58 changes: 23 additions & 35 deletions src/map.cpp
Expand Up @@ -1440,23 +1440,20 @@ void Map::timerUpdate(float dtime, float unload_timeout,

bool all_blocks_deleted = true;

std::list<MapBlock*> blocks;
MapBlockVect blocks;
sector->getBlocks(blocks);

for(std::list<MapBlock*>::iterator i = blocks.begin();
i != blocks.end(); ++i)
{
for(MapBlockVect::iterator i = blocks.begin();
i != blocks.end(); ++i) {
MapBlock *block = (*i);

block->incrementUsageTimer(dtime);

if(block->refGet() == 0 && block->getUsageTimer() > unload_timeout)
{
if(block->refGet() == 0 && block->getUsageTimer() > unload_timeout) {
v3s16 p = block->getPos();

// 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);
if (!saveBlock(block))
continue;
Expand All @@ -1471,15 +1468,13 @@ void Map::timerUpdate(float dtime, float unload_timeout,

deleted_blocks_count++;
}
else
{
else {
all_blocks_deleted = false;
block_count_all++;
}
}

if(all_blocks_deleted)
{
if(all_blocks_deleted) {
sector_deletion_queue.push_back(si->first);
}
}
Expand Down Expand Up @@ -2982,8 +2977,7 @@ std::string ServerMap::getBlockFilename(v3s16 p)
void ServerMap::save(ModifiedState save_level)
{
DSTACK(__FUNCTION_NAME);
if(m_map_saving_enabled == false)
{
if(m_map_saving_enabled == false) {
infostream<<"WARNING: Not saving map, saving disabled."<<std::endl;
return;
}
Expand All @@ -2992,8 +2986,7 @@ void ServerMap::save(ModifiedState save_level)
infostream<<"ServerMap: Saving whole map, this can take time."
<<std::endl;

if(m_map_metadata_changed || save_level == MOD_STATE_CLEAN)
{
if(m_map_metadata_changed || save_level == MOD_STATE_CLEAN) {
saveMapMeta();
}

Expand All @@ -3008,30 +3001,27 @@ void ServerMap::save(ModifiedState save_level)
bool save_started = false;

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;
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);
sector_meta_count++;
}
std::list<MapBlock*> blocks;

MapBlockVect blocks;
sector->getBlocks(blocks);

for(std::list<MapBlock*>::iterator j = blocks.begin();
j != blocks.end(); ++j)
{
for(MapBlockVect::iterator j = blocks.begin();
j != blocks.end(); ++j) {
MapBlock *block = *j;

block_count_all++;

if(block->getModified() >= (u32)save_level)
{
if(block->getModified() >= (u32)save_level) {
// Lazy beginSave()
if(!save_started){
if(!save_started) {
beginSave();
save_started = true;
}
Expand All @@ -3049,15 +3039,15 @@ void ServerMap::save(ModifiedState save_level)
}
}
}

if(save_started)
endSave();

/*
Only print if something happened or saved whole map
*/
if(save_level == MOD_STATE_CLEAN || sector_meta_count != 0
|| block_count != 0)
{
|| block_count != 0) {
infostream<<"ServerMap: Written: "
<<sector_meta_count<<" sector metadata files, "
<<block_count<<" block files"
Expand Down Expand Up @@ -3085,14 +3075,12 @@ void ServerMap::listAllLoadedBlocks(std::vector<v3s16> &dst)
{
MapSector *sector = si->second;

std::list<MapBlock*> blocks;
MapBlockVect blocks;
sector->getBlocks(blocks);

for(std::list<MapBlock*>::iterator i = blocks.begin();
i != blocks.end(); ++i)
{
MapBlock *block = (*i);
v3s16 p = block->getPos();
for(MapBlockVect::iterator i = blocks.begin();
i != blocks.end(); ++i) {
v3s16 p = (*i)->getPos();
dst.push_back(p);
}
}
Expand Down
2 changes: 2 additions & 0 deletions src/mapblock.h
Expand Up @@ -614,6 +614,8 @@ class MapBlock /*: public NodeContainer*/
int m_refcount;
};

typedef std::vector<MapBlock*> MapBlockVect;

inline bool blockpos_over_limit(v3s16 p)
{
return
Expand Down
2 changes: 1 addition & 1 deletion src/mapsector.cpp
Expand Up @@ -133,7 +133,7 @@ void MapSector::deleteBlock(MapBlock *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();
bi != m_blocks.end(); ++bi)
Expand Down
6 changes: 3 additions & 3 deletions src/mapsector.h
Expand Up @@ -22,11 +22,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,

#include "irrlichttypes.h"
#include "irr_v2d.h"
#include "mapblock.h"
#include <ostream>
#include <map>
#include <list>
#include <vector>

class MapBlock;
class Map;
class IGameDef;

Expand Down Expand Up @@ -61,7 +61,7 @@ class MapSector

void deleteBlock(MapBlock *block);

void getBlocks(std::list<MapBlock*> &dest);
void getBlocks(MapBlockVect &dest);

// Always false at the moment, because sector contains no metadata.
bool differs_from_disk;
Expand Down

0 comments on commit fd70f4f

Please sign in to comment.