mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 10:03:45 +01:00
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:
parent
bb59a8543d
commit
caf8d2a9d1
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user