Skip to content

Commit

Permalink
Increase performance of getLight() by at least 2x
Browse files Browse the repository at this point in the history
Leads to the following increases:
getSmoothLight() approx.     40% increase
getTileInfo() approx.        25% increase
MapBlockMesh::MapBlockMesh() 25-30%
  • Loading branch information
Zeno- committed Dec 9, 2014
1 parent a1ea017 commit c5f6f9f
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/mapblock_mesh.cpp
Expand Up @@ -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++;
Expand Down
6 changes: 6 additions & 0 deletions src/mapnode.cpp
Expand Up @@ -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]
Expand Down
21 changes: 21 additions & 0 deletions src/mapnode.h
Expand Up @@ -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.
*/
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit c5f6f9f

Please sign in to comment.