tried to reduce unnecessary map saving disk i/o a bit

master
Perttu Ahola 2011-06-05 18:57:36 +03:00
parent a649d43fe7
commit 9b565b6bc4
5 changed files with 106 additions and 58 deletions

View File

@ -694,7 +694,7 @@ void ServerEnvironment::step(float dtime)
if(block==NULL) if(block==NULL)
continue; continue;
// Set current time as timestamp // Set current time as timestamp (and let it set ChangedFlag)
block->setTimestamp(m_game_time); block->setTimestamp(m_game_time);
} }
@ -721,7 +721,7 @@ void ServerEnvironment::step(float dtime)
if(m_game_time > stamp && stamp != BLOCK_TIMESTAMP_UNDEFINED) if(m_game_time > stamp && stamp != BLOCK_TIMESTAMP_UNDEFINED)
dtime_s = m_game_time - block->getTimestamp(); dtime_s = m_game_time - block->getTimestamp();
// Set current time as timestamp // Set current time as timestamp (and let it set ChangedFlag)
block->setTimestamp(m_game_time); block->setTimestamp(m_game_time);
//dstream<<"Block is "<<dtime_s<<" seconds old."<<std::endl; //dstream<<"Block is "<<dtime_s<<" seconds old."<<std::endl;
@ -737,6 +737,8 @@ void ServerEnvironment::step(float dtime)
event.type = MEET_BLOCK_NODE_METADATA_CHANGED; event.type = MEET_BLOCK_NODE_METADATA_CHANGED;
event.p = p; event.p = p;
m_map->dispatchEvent(&event); m_map->dispatchEvent(&event);
block->setChangedFlag();
} }
// TODO: Do something // TODO: Do something
@ -790,7 +792,7 @@ void ServerEnvironment::step(float dtime)
continue; continue;
// Set current time as timestamp // Set current time as timestamp
block->setTimestamp(m_game_time); block->setTimestampNoChangedFlag(m_game_time);
// Run node metadata // Run node metadata
bool changed = block->m_node_metadata.step(dtime); bool changed = block->m_node_metadata.step(dtime);
@ -800,6 +802,8 @@ void ServerEnvironment::step(float dtime)
event.type = MEET_BLOCK_NODE_METADATA_CHANGED; event.type = MEET_BLOCK_NODE_METADATA_CHANGED;
event.p = p; event.p = p;
m_map->dispatchEvent(&event); m_map->dispatchEvent(&event);
block->setChangedFlag();
} }
} }
} }
@ -821,7 +825,7 @@ void ServerEnvironment::step(float dtime)
continue; continue;
// Set current time as timestamp // Set current time as timestamp
block->setTimestamp(m_game_time); block->setTimestampNoChangedFlag(m_game_time);
/* /*
Do stuff! Do stuff!
@ -996,49 +1000,8 @@ u16 getFreeServerActiveObjectId(
u16 ServerEnvironment::addActiveObject(ServerActiveObject *object) u16 ServerEnvironment::addActiveObject(ServerActiveObject *object)
{ {
assert(object); assert(object);
if(object->getId() == 0) u16 id = addActiveObjectRaw(object, true);
{ return id;
u16 new_id = getFreeServerActiveObjectId(m_active_objects);
if(new_id == 0)
{
dstream<<"WARNING: ServerEnvironment::addActiveObject(): "
<<"no free ids available"<<std::endl;
delete object;
return 0;
}
object->setId(new_id);
}
if(isFreeServerActiveObjectId(object->getId(), m_active_objects) == false)
{
dstream<<"WARNING: ServerEnvironment::addActiveObject(): "
<<"id is not free ("<<object->getId()<<")"<<std::endl;
delete object;
return 0;
}
/*dstream<<"INGO: ServerEnvironment::addActiveObject(): "
<<"added (id="<<object->getId()<<")"<<std::endl;*/
m_active_objects.insert(object->getId(), object);
// Add static object to active static list of the block
v3f objectpos = object->getBasePosition();
std::string staticdata = object->getStaticData();
StaticObject s_obj(object->getType(), objectpos, staticdata);
// Add to the block where the object is located in
v3s16 blockpos = getNodeBlockPos(floatToInt(objectpos, BS));
MapBlock *block = m_map->getBlockNoCreateNoEx(blockpos);
if(block)
{
block->m_static_objects.m_active.insert(object->getId(), s_obj);
object->m_static_exists = true;
object->m_static_block = blockpos;
}
else{
dstream<<"WARNING: Server: Could not find a block for "
<<"storing newly added static active object"<<std::endl;
}
return object->getId();
} }
/* /*
@ -1141,6 +1104,58 @@ ActiveObjectMessage ServerEnvironment::getActiveObjectMessage()
************ Private methods ************* ************ Private methods *************
*/ */
u16 ServerEnvironment::addActiveObjectRaw(ServerActiveObject *object,
bool set_changed)
{
assert(object);
if(object->getId() == 0)
{
u16 new_id = getFreeServerActiveObjectId(m_active_objects);
if(new_id == 0)
{
dstream<<"WARNING: ServerEnvironment::addActiveObjectRaw(): "
<<"no free ids available"<<std::endl;
delete object;
return 0;
}
object->setId(new_id);
}
if(isFreeServerActiveObjectId(object->getId(), m_active_objects) == false)
{
dstream<<"WARNING: ServerEnvironment::addActiveObjectRaw(): "
<<"id is not free ("<<object->getId()<<")"<<std::endl;
delete object;
return 0;
}
/*dstream<<"INGO: ServerEnvironment::addActiveObjectRaw(): "
<<"added (id="<<object->getId()<<")"<<std::endl;*/
m_active_objects.insert(object->getId(), object);
// Add static object to active static list of the block
v3f objectpos = object->getBasePosition();
std::string staticdata = object->getStaticData();
StaticObject s_obj(object->getType(), objectpos, staticdata);
// Add to the block where the object is located in
v3s16 blockpos = getNodeBlockPos(floatToInt(objectpos, BS));
MapBlock *block = m_map->getBlockNoCreateNoEx(blockpos);
if(block)
{
block->m_static_objects.m_active.insert(object->getId(), s_obj);
object->m_static_exists = true;
object->m_static_block = blockpos;
if(set_changed)
block->setChangedFlag();
}
else{
dstream<<"WARNING: Server: Could not find a block for "
<<"storing newly added static active object"<<std::endl;
}
return object->getId();
}
/* /*
Remove objects that satisfy (m_removed && m_known_by_count==0) Remove objects that satisfy (m_removed && m_known_by_count==0)
*/ */
@ -1231,8 +1246,8 @@ void ServerEnvironment::activateObjects(MapBlock *block)
continue; continue;
} }
// This will also add the object to the active static list // This will also add the object to the active static list
addActiveObject(obj); addActiveObjectRaw(obj, false);
//u16 id = addActiveObject(obj); //u16 id = addActiveObjectRaw(obj, false);
} }
// Clear stored list // Clear stored list
block->m_static_objects.m_stored.clear(); block->m_static_objects.m_stored.clear();
@ -1245,7 +1260,8 @@ void ServerEnvironment::activateObjects(MapBlock *block)
block->m_static_objects.m_stored.push_back(s_obj); block->m_static_objects.m_stored.push_back(s_obj);
} }
// Block has been modified // Block has been modified
block->setChangedFlag(); // NOTE: No it has not really. Save I/O here.
//block->setChangedFlag();
} }
/* /*

View File

@ -159,7 +159,7 @@ public:
void loadMeta(const std::string &savedir); void loadMeta(const std::string &savedir);
/* /*
ActiveObjects External ActiveObject interface
------------------------------------------- -------------------------------------------
*/ */
@ -198,13 +198,31 @@ public:
ActiveObjectMessage getActiveObjectMessage(); ActiveObjectMessage getActiveObjectMessage();
/* /*
ActiveBlockModifiers ActiveBlockModifiers (TODO)
------------------------------------------- -------------------------------------------
*/ */
void addActiveBlockModifier(ActiveBlockModifier *abm); void addActiveBlockModifier(ActiveBlockModifier *abm);
private: private:
/*
Internal ActiveObject interface
-------------------------------------------
*/
/*
Add an active object to the environment.
Called by addActiveObject.
Object may be deleted by environment immediately.
If id of object is 0, assigns a free id to it.
Returns the id of the object.
Returns 0 if not added and thus deleted.
*/
u16 addActiveObjectRaw(ServerActiveObject *object, bool set_changed);
/* /*
Remove all objects that satisfy (m_removed && m_known_by_count==0) Remove all objects that satisfy (m_removed && m_known_by_count==0)
*/ */

View File

@ -297,7 +297,7 @@ SUGG: Erosion simulation at map generation time
SUGG: Try out the notch way of generating maps, that is, make bunches SUGG: Try out the notch way of generating maps, that is, make bunches
of low-res 3d noise and interpolate linearly. of low-res 3d noise and interpolate linearly.
Mapgen v2: Mapgen v2 (the current one):
* Possibly add some kind of erosion and other stuff * Possibly add some kind of erosion and other stuff
* Better water generation (spread it to underwater caverns but don't * Better water generation (spread it to underwater caverns but don't
fill dungeons that don't touch big water masses) fill dungeons that don't touch big water masses)
@ -306,6 +306,16 @@ Mapgen v2:
the other chunk making nasty straight walls when the other chunk the other chunk making nasty straight walls when the other chunk
is generated. Fix it. Maybe just a special case if the ground is is generated. Fix it. Maybe just a special case if the ground is
flat? flat?
* Consider not updating this one and make a good mainly block-based
generator
SUGG: Make two "modified states", one that forces the block to be saved at
the next save event, and one that makes the block to be saved at exit
time.
TODO: Add a not_fully_generated flag to MapBlock, which would be set for
blocks that contain eg. trees from neighboring generations but haven't
been generated itself. This is required for the future generator.
Misc. stuff: Misc. stuff:
------------ ------------

View File

@ -4987,9 +4987,7 @@ void ServerMap::save(bool only_changed)
u32 sector_meta_count = 0; u32 sector_meta_count = 0;
u32 block_count = 0; u32 block_count = 0;
u32 block_count_all = 0; // Number of blocks in memory
{ //sectorlock
//JMutexAutoLock lock(m_sector_mutex); // Bulk comment-out
core::map<v2s16, MapSector*>::Iterator i = m_sectors.getIterator(); core::map<v2s16, MapSector*>::Iterator i = m_sectors.getIterator();
for(; i.atEnd() == false; i++) for(; i.atEnd() == false; i++)
@ -5008,6 +5006,9 @@ void ServerMap::save(bool only_changed)
for(j=blocks.begin(); j!=blocks.end(); j++) for(j=blocks.begin(); j!=blocks.end(); j++)
{ {
MapBlock *block = *j; MapBlock *block = *j;
block_count_all++;
if(block->getChangedFlag() || only_changed == false) if(block->getChangedFlag() || only_changed == false)
{ {
saveBlock(block); saveBlock(block);
@ -5022,8 +5023,6 @@ void ServerMap::save(bool only_changed)
} }
} }
}//sectorlock
/* /*
Only print if something happened or saved whole map Only print if something happened or saved whole map
*/ */
@ -5033,6 +5032,7 @@ void ServerMap::save(bool only_changed)
dstream<<DTIME<<"ServerMap: Written: " dstream<<DTIME<<"ServerMap: Written: "
<<sector_meta_count<<" sector metadata files, " <<sector_meta_count<<" sector metadata files, "
<<block_count<<" block files" <<block_count<<" block files"
<<", "<<block_count_all<<" blocks in memory."
<<std::endl; <<std::endl;
} }
} }

View File

@ -628,6 +628,10 @@ public:
m_timestamp = time; m_timestamp = time;
setChangedFlag(); setChangedFlag();
} }
void setTimestampNoChangedFlag(u32 time)
{
m_timestamp = time;
}
u32 getTimestamp() u32 getTimestamp()
{ {
return m_timestamp; return m_timestamp;