summaryrefslogtreecommitdiff
path: root/src/serverenvironment.cpp
diff options
context:
space:
mode:
authorLoïc Blot <nerzhul@users.noreply.github.com>2018-04-04 10:56:46 +0200
committerGitHub <noreply@github.com>2018-04-04 10:56:46 +0200
commit392e80e3f13c977b5499eb424fa7d65085fb08f5 (patch)
treea5aa389a8476c23bc670ecc01994fdab78358762 /src/serverenvironment.cpp
parent5070ca2111dd5b3f333a942059ef2c592de8dc24 (diff)
downloadminetest-392e80e3f13c977b5499eb424fa7d65085fb08f5.tar.gz
minetest-392e80e3f13c977b5499eb424fa7d65085fb08f5.tar.bz2
minetest-392e80e3f13c977b5499eb424fa7d65085fb08f5.zip
Huge LBM lookup performance improvement on mapblock loading (#7195)
* Huge LBM lookup performance improvement on mapblock loading
Diffstat (limited to 'src/serverenvironment.cpp')
-rw-r--r--src/serverenvironment.cpp31
1 files changed, 20 insertions, 11 deletions
diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp
index 06cfa5839..25319699a 100644
--- a/src/serverenvironment.cpp
+++ b/src/serverenvironment.cpp
@@ -254,23 +254,32 @@ void LBMManager::applyLBMs(ServerEnvironment *env, MapBlock *block, u32 stamp)
MapNode n;
content_t c;
lbm_lookup_map::const_iterator it = getLBMsIntroducedAfter(stamp);
- for (pos.X = 0; pos.X < MAP_BLOCKSIZE; pos.X++)
- for (pos.Y = 0; pos.Y < MAP_BLOCKSIZE; pos.Y++)
- for (pos.Z = 0; pos.Z < MAP_BLOCKSIZE; pos.Z++)
- {
- n = block->getNodeNoEx(pos);
- c = n.getContent();
- for (LBMManager::lbm_lookup_map::const_iterator iit = it;
- iit != m_lbm_lookup.end(); ++iit) {
- const std::vector<LoadingBlockModifierDef *> *lbm_list =
- iit->second.lookup(c);
+ for (; it != m_lbm_lookup.end(); ++it) {
+ // Cache previous version to speedup lookup which has a very high performance
+ // penalty on each call
+ content_t previous_c{};
+ std::vector<LoadingBlockModifierDef *> *lbm_list = nullptr;
+
+ for (pos.X = 0; pos.X < MAP_BLOCKSIZE; pos.X++)
+ for (pos.Y = 0; pos.Y < MAP_BLOCKSIZE; pos.Y++)
+ for (pos.Z = 0; pos.Z < MAP_BLOCKSIZE; pos.Z++) {
+ n = block->getNodeNoEx(pos);
+ c = n.getContent();
+
+ // If content_t are not matching perform an LBM lookup
+ if (previous_c != c) {
+ lbm_list = (std::vector<LoadingBlockModifierDef *> *)
+ it->second.lookup(c);
+ previous_c = c;
+ }
+
if (!lbm_list)
continue;
for (auto lbmdef : *lbm_list) {
lbmdef->trigger(env, pos + pos_of_block, n);
}
}
- }
+ }
}
/*