mirror of
https://github.com/minetest/minetest.git
synced 2024-11-05 07:13:46 +01:00
Replace std::list by std::vector into ClientMap::updateDrawList, Map::timerUpdate and ServerMap::save().
This will speedup the loop reading into those functions
This commit is contained in:
parent
3c91ad8fc2
commit
fd70f4f2f0
@ -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;
|
||||||
|
|
||||||
|
58
src/map.cpp
58
src/map.cpp
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user