Make spreadLight 2.5x faster

This commit is contained in:
gregorycu 2015-11-03 16:08:41 +11:00 committed by BlockMen
parent 303c43624f
commit 90cacc0184
2 changed files with 18 additions and 12 deletions

View File

@ -432,7 +432,7 @@ void Map::unLightNeighbors(enum LightBank bank,
goes on recursively. goes on recursively.
*/ */
void Map::spreadLight(enum LightBank bank, void Map::spreadLight(enum LightBank bank,
std::set<v3s16> & from_nodes, std::vector<v3s16> & from_nodes,
std::map<v3s16, MapBlock*> & modified_blocks) std::map<v3s16, MapBlock*> & modified_blocks)
{ {
INodeDefManager *nodemgr = m_gamedef->ndef(); INodeDefManager *nodemgr = m_gamedef->ndef();
@ -451,7 +451,8 @@ void Map::spreadLight(enum LightBank bank,
u32 blockchangecount = 0; u32 blockchangecount = 0;
std::set<v3s16> lighted_nodes; std::vector<v3s16> lighted_nodes;
lighted_nodes.reserve(100);
/* /*
Initialize block cache Initialize block cache
@ -461,7 +462,7 @@ void Map::spreadLight(enum LightBank bank,
// Cache this a bit, too // Cache this a bit, too
bool block_checked_in_modified = false; bool block_checked_in_modified = false;
for(std::set<v3s16>::iterator j = from_nodes.begin(); for(std::vector<v3s16>::iterator j = from_nodes.begin();
j != from_nodes.end(); ++j) j != from_nodes.end(); ++j)
{ {
v3s16 pos = *j; v3s16 pos = *j;
@ -528,7 +529,7 @@ void Map::spreadLight(enum LightBank bank,
*/ */
if(n2.getLight(bank, nodemgr) > undiminish_light(oldlight)) if(n2.getLight(bank, nodemgr) > undiminish_light(oldlight))
{ {
lighted_nodes.insert(n2pos); lighted_nodes.push_back(n2pos);
changed = true; changed = true;
} }
/* /*
@ -541,7 +542,7 @@ void Map::spreadLight(enum LightBank bank,
{ {
n2.setLight(bank, newlight, nodemgr); n2.setLight(bank, newlight, nodemgr);
block->setNode(relpos, n2); block->setNode(relpos, n2);
lighted_nodes.insert(n2pos); lighted_nodes.push_back(n2pos);
changed = true; changed = true;
} }
} }
@ -564,6 +565,9 @@ void Map::spreadLight(enum LightBank bank,
<<" for "<<from_nodes.size()<<" nodes" <<" for "<<from_nodes.size()<<" nodes"
<<std::endl;*/ <<std::endl;*/
std::sort(lighted_nodes.begin(), lighted_nodes.end());
lighted_nodes.erase(std::unique(lighted_nodes.begin(), lighted_nodes.end()), lighted_nodes.end());
if(!lighted_nodes.empty()) if(!lighted_nodes.empty())
spreadLight(bank, lighted_nodes, modified_blocks); spreadLight(bank, lighted_nodes, modified_blocks);
} }
@ -575,8 +579,8 @@ void Map::lightNeighbors(enum LightBank bank,
v3s16 pos, v3s16 pos,
std::map<v3s16, MapBlock*> & modified_blocks) std::map<v3s16, MapBlock*> & modified_blocks)
{ {
std::set<v3s16> from_nodes; std::vector<v3s16> from_nodes;
from_nodes.insert(pos); from_nodes.push_back(pos);
spreadLight(bank, from_nodes, modified_blocks); spreadLight(bank, from_nodes, modified_blocks);
} }
@ -827,7 +831,8 @@ void Map::updateLighting(enum LightBank bank,
{ {
//TimeTaker timer("spreadLight"); //TimeTaker timer("spreadLight");
spreadLight(bank, light_sources, modified_blocks); std::vector<v3s16> light_sources_vec(light_sources.begin(), light_sources.end());
spreadLight(bank, light_sources_vec, modified_blocks);
} }
/*if(debug) /*if(debug)
@ -1060,7 +1065,8 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n,
/* /*
Spread light from all nodes that might be capable of doing so Spread light from all nodes that might be capable of doing so
*/ */
spreadLight(bank, light_sources, modified_blocks); std::vector<v3s16> light_sources_vec(light_sources.begin(), light_sources.end());
spreadLight(bank, light_sources_vec, modified_blocks);
} }
/* /*
@ -1183,7 +1189,8 @@ void Map::removeNodeAndUpdate(v3s16 p,
/* /*
Recalculate lighting Recalculate lighting
*/ */
spreadLight(bank, light_sources, modified_blocks); std::vector<v3s16> light_sources_vec(light_sources.begin(), light_sources.end());
spreadLight(bank, light_sources_vec, modified_blocks);
} }
// Add the block of the removed node to modified_blocks // Add the block of the removed node to modified_blocks
@ -1619,7 +1626,6 @@ s32 Map::transforming_liquid_size() {
void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks) void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks)
{ {
INodeDefManager *nodemgr = m_gamedef->ndef(); INodeDefManager *nodemgr = m_gamedef->ndef();
DSTACK(FUNCTION_NAME); DSTACK(FUNCTION_NAME);

View File

@ -220,7 +220,7 @@ public:
std::map<v3s16, MapBlock*> & modified_blocks); std::map<v3s16, MapBlock*> & modified_blocks);
void spreadLight(enum LightBank bank, void spreadLight(enum LightBank bank,
std::set<v3s16> & from_nodes, std::vector<v3s16> & from_nodes,
std::map<v3s16, MapBlock*> & modified_blocks); std::map<v3s16, MapBlock*> & modified_blocks);
void lightNeighbors(enum LightBank bank, void lightNeighbors(enum LightBank bank,