diff options
author | Craig Robbins <kde.psych@gmail.com> | 2015-02-07 17:52:56 +1000 |
---|---|---|
committer | Loic Blot <loic.blot@unix-experience.fr> | 2015-02-10 16:23:37 +0100 |
commit | caf8d2a9d16a313bbc86a27ad0642efc76852e9f (patch) | |
tree | 9787d5960dc11c3fbe37ab05efb103fcbb3dcddc | |
parent | bb59a8543d44b566d8b39fd4727d552a8d4f3e90 (diff) | |
download | minetest-caf8d2a9d16a313bbc86a27ad0642efc76852e9f.tar.gz minetest-caf8d2a9d16a313bbc86a27ad0642efc76852e9f.tar.bz2 minetest-caf8d2a9d16a313bbc86a27ad0642efc76852e9f.zip |
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)
-rw-r--r-- | src/mapblock.cpp | 29 | ||||
-rw-r--r-- | src/mapnode.cpp | 16 | ||||
-rw-r--r-- | src/mapnode.h | 8 |
3 files changed, 36 insertions, 17 deletions
diff --git a/src/mapblock.cpp b/src/mapblock.cpp index ecd9a016b..a05b7a4da 100644 --- a/src/mapblock.cpp +++ b/src/mapblock.cpp @@ -330,47 +330,42 @@ void MapBlock::copyFrom(VoxelManipulator &dst) void MapBlock::actuallyUpdateDayNightDiff() { INodeDefManager *nodemgr = m_gamedef->ndef(); + // Running this function un-expires m_day_night_differs m_day_night_differs_expired = false; - if(data == NULL) - { + if (data == NULL) { m_day_night_differs = false; return; } - bool differs = false; + bool 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]; - if(n.getLight(LIGHTBANK_DAY, nodemgr) != n.getLight(LIGHTBANK_NIGHT, nodemgr)) - { - differs = true; + + differs = !n.isLightDayNightEq(nodemgr); + if (differs) break; - } } /* 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; - 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]; - if(n.getContent() != CONTENT_AIR) - { + if (n.getContent() != CONTENT_AIR) { only_air = false; break; } } - if(only_air) + if (only_air) differs = false; } diff --git a/src/mapnode.cpp b/src/mapnode.cpp index 056b94054..388071a17 100644 --- a/src/mapnode.cpp +++ b/src/mapnode.cpp @@ -74,6 +74,22 @@ void MapNode::setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr 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 { // Select the brightest of [light source, propagated light] diff --git a/src/mapnode.h b/src/mapnode.h index 82c53e7d4..b7d9f3acd 100644 --- a/src/mapnode.h +++ b/src/mapnode.h @@ -192,6 +192,14 @@ struct MapNode } 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; /** |