summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Robbins <kde.psych@gmail.com>2014-12-10 00:45:07 +1000
committerCraig Robbins <kde.psych@gmail.com>2014-12-10 00:52:02 +1000
commitc5f6f9f77ac1df4b223649fcaca9a66333aa8786 (patch)
tree87c5efb5da53fb26c1cfca4ab717258ab12ad897
parenta1ea017b512ea8f99c40dca52a57ff58054c5acc (diff)
downloadminetest-c5f6f9f77ac1df4b223649fcaca9a66333aa8786.tar.gz
minetest-c5f6f9f77ac1df4b223649fcaca9a66333aa8786.tar.bz2
minetest-c5f6f9f77ac1df4b223649fcaca9a66333aa8786.zip
Increase performance of getLight() by at least 2x
Leads to the following increases: getSmoothLight() approx. 40% increase getTileInfo() approx. 25% increase MapBlockMesh::MapBlockMesh() 25-30%
-rw-r--r--src/mapblock_mesh.cpp4
-rw-r--r--src/mapnode.cpp6
-rw-r--r--src/mapnode.h21
3 files changed, 29 insertions, 2 deletions
diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp
index 0ca24a1f9..29b0e92f5 100644
--- a/src/mapblock_mesh.cpp
+++ b/src/mapblock_mesh.cpp
@@ -259,8 +259,8 @@ static u16 getSmoothLightCombined(v3s16 p, MeshMakeData *data)
light_source_max = f.light_source;
// Check f.solidness because fast-style leaves look better this way
if (f.param_type == CPT_LIGHT && f.solidness != 2) {
- light_day += decode_light(n.getLight(LIGHTBANK_DAY, ndef));
- light_night += decode_light(n.getLight(LIGHTBANK_NIGHT, ndef));
+ light_day += decode_light(n.getLightNoChecks(LIGHTBANK_DAY, &f));
+ light_night += decode_light(n.getLightNoChecks(LIGHTBANK_NIGHT, &f));
light_count++;
} else {
ambient_occlusion++;
diff --git a/src/mapnode.cpp b/src/mapnode.cpp
index fbf0ac8c9..4e8feb047 100644
--- a/src/mapnode.cpp
+++ b/src/mapnode.cpp
@@ -88,6 +88,12 @@ u8 MapNode::getLight(enum LightBank bank, INodeDefManager *nodemgr) const
return MYMAX(f.light_source, light);
}
+u8 MapNode::getLightNoChecks(enum LightBank bank, const ContentFeatures *f)
+{
+ return MYMAX(f->light_source,
+ bank == LIGHTBANK_DAY ? param1 & 0x0f : (param1 >> 4) & 0x0f);
+}
+
bool MapNode::getLightBanks(u8 &lightday, u8 &lightnight, INodeDefManager *nodemgr) const
{
// Select the brightest of [light source, propagated light]
diff --git a/src/mapnode.h b/src/mapnode.h
index d0b949e6f..349739be7 100644
--- a/src/mapnode.h
+++ b/src/mapnode.h
@@ -108,6 +108,9 @@ enum Rotation {
#define LEVELED_MASK 0x3F
#define LEVELED_MAX LEVELED_MASK
+
+struct ContentFeatures;
+
/*
This is the stuff what the whole world consists of.
*/
@@ -188,6 +191,24 @@ struct MapNode
void setLight(enum LightBank bank, u8 a_light, INodeDefManager *nodemgr);
u8 getLight(enum LightBank bank, INodeDefManager *nodemgr) const;
+
+ /**
+ * This function differs from getLight(enum LightBank bank, INodeDefManager *nodemgr)
+ * in that the ContentFeatures of the node in question are not retrieved by
+ * the function itself. Thus, if you have already called nodemgr->get() to
+ * get the ContentFeatures you pass it to this function instead of the
+ * function getting ContentFeatures itself. Since INodeDefManager::get()
+ * is relatively expensive this can lead to significant performance
+ * improvements in some situations. Call this function if (and only if)
+ * you have already retrieved the ContentFeatures by calling
+ * INodeDefManager::get() for the node you're working with and the
+ * pre-conditions listed are true.
+ *
+ * @pre f != NULL
+ * @pre f->param_type == CPT_LIGHT
+ */
+ u8 getLightNoChecks(LightBank bank, const ContentFeatures *f);
+
bool getLightBanks(u8 &lightday, u8 &lightnight, INodeDefManager *nodemgr) const;
// 0 <= daylight_factor <= 1000