Increase MapBlock::actuallyUpdateDayNightDiff() performance by 2-8x. ok @celeron55

Before patch, function consumes up to ~8% of the main server loop. After, ~0% (below level of 2 places of significance)
This commit is contained in:
Craig Robbins 2015-02-07 17:52:56 +10:00 committed by Loic Blot
parent bb59a8543d
commit caf8d2a9d1
3 changed files with 36 additions and 17 deletions

@ -330,47 +330,42 @@ void MapBlock::copyFrom(VoxelManipulator &dst)
void MapBlock::actuallyUpdateDayNightDiff() void MapBlock::actuallyUpdateDayNightDiff()
{ {
INodeDefManager *nodemgr = m_gamedef->ndef(); INodeDefManager *nodemgr = m_gamedef->ndef();
// Running this function un-expires m_day_night_differs // Running this function un-expires m_day_night_differs
m_day_night_differs_expired = false; m_day_night_differs_expired = false;
if(data == NULL) if (data == NULL) {
{
m_day_night_differs = false; m_day_night_differs = false;
return; return;
} }
bool differs = false; bool differs;
/* /*
Check if any lighting value differs Check if any lighting value differs
*/ */
for(u32 i=0; i<MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE; i++) for (u32 i = 0; i < MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE; i++) {
{
MapNode &n = data[i]; MapNode &n = data[i];
if(n.getLight(LIGHTBANK_DAY, nodemgr) != n.getLight(LIGHTBANK_NIGHT, nodemgr))
{ differs = !n.isLightDayNightEq(nodemgr);
differs = true; if (differs)
break; break;
}
} }
/* /*
If some lighting values differ, check if the whole thing is If some lighting values differ, check if the whole thing is
just air. If it is, differ = false just air. If it is just air, differs = false
*/ */
if(differs) if (differs) {
{
bool only_air = true; bool only_air = true;
for(u32 i=0; i<MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE; i++) for (u32 i = 0; i < MAP_BLOCKSIZE*MAP_BLOCKSIZE*MAP_BLOCKSIZE; i++) {
{
MapNode &n = data[i]; MapNode &n = data[i];
if(n.getContent() != CONTENT_AIR) if (n.getContent() != CONTENT_AIR) {
{
only_air = false; only_air = false;
break; break;
} }
} }
if(only_air) if (only_air)
differs = false; differs = false;
} }

@ -74,6 +74,22 @@ void MapNode::setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr
assert(0); assert(0);
} }
bool MapNode::isLightDayNightEq(INodeDefManager *nodemgr) const
{
const ContentFeatures &f = nodemgr->get(*this);
bool isEqual;
if (f.param_type == CPT_LIGHT) {
u8 day = MYMAX(f.light_source, param1 & 0x0f);
u8 night = MYMAX(f.light_source, (param1 >> 4) & 0x0f);
isEqual = day == night;
} else {
isEqual = true;
}
return isEqual;
}
u8 MapNode::getLight(enum LightBank bank, INodeDefManager *nodemgr) const u8 MapNode::getLight(enum LightBank bank, INodeDefManager *nodemgr) const
{ {
// Select the brightest of [light source, propagated light] // Select the brightest of [light source, propagated light]

@ -192,6 +192,14 @@ struct MapNode
} }
void setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr); void setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr);
/**
* Check if the light value for night differs from the light value for day.
*
* @return If the light values are equal, returns true; otherwise false
*/
bool isLightDayNightEq(INodeDefManager *nodemgr) const;
u8 getLight(enum LightBank bank, INodeDefManager *nodemgr) const; u8 getLight(enum LightBank bank, INodeDefManager *nodemgr) const;
/** /**