Increase performance of getLight() by at least 2x
authorCraig Robbins <kde.psych@gmail.com>
Tue, 9 Dec 2014 14:45:07 +0000 (00:45 +1000)
committerCraig Robbins <kde.psych@gmail.com>
Tue, 9 Dec 2014 14:52:02 +0000 (00:52 +1000)
Leads to the following increases:
getSmoothLight() approx.     40% increase
getTileInfo() approx.        25% increase
MapBlockMesh::MapBlockMesh() 25-30%

src/mapblock_mesh.cpp
src/mapnode.cpp
src/mapnode.h

index 0ca24a1f919b2f847142f354198edb4a5415c4a3..29b0e92f5855a117f3a113d3536bebd53aed5d48 100644 (file)
@@ -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++;
index fbf0ac8c90d39c3313194641a8e4bc39eaea0829..4e8feb047762cdee2a377ba0cee5d6911ecdf21a 100644 (file)
@@ -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]
index d0b949e6ff60b257f838e107a4fd56db8383fbfc..349739be74b344fcf6d42e8274383f728da3943c 100644 (file)
@@ -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