forked from Mirrorlandia_minetest/minetest
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:
parent
2066655aae
commit
06f328207f
@ -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,8 +568,8 @@ 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();
|
||||||
if(trigger_interval < 0.001)
|
if(trigger_interval < 0.001)
|
||||||
@ -1182,7 +1182,7 @@ void ServerEnvironment::step(float dtime)
|
|||||||
<<") being handled"<<std::endl;*/
|
<<") being handled"<<std::endl;*/
|
||||||
|
|
||||||
MapBlock *block = m_map->getBlockNoCreateNoEx(p);
|
MapBlock *block = m_map->getBlockNoCreateNoEx(p);
|
||||||
if(block==NULL)
|
if(block == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Set current time as timestamp
|
// Set current time as timestamp
|
||||||
@ -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,9 +323,8 @@ 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);
|
||||||
if(info.new_speed.Y - info.old_speed.Y > 0.1*BS &&
|
if(info.new_speed.Y - info.old_speed.Y > 0.1*BS &&
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
66
src/map.cpp
66
src/map.cpp
@ -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> §orList)
|
||||||
{
|
{
|
||||||
for(std::list<v2s16>::iterator j = list.begin();
|
for(std::vector<v2s16>::iterator j = sectorList.begin();
|
||||||
j != list.end(); ++j)
|
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: ";
|
||||||
|
12
src/map.h
12
src/map.h
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user