Huge LBM lookup performance improvement on mapblock loading (#7195)
* Huge LBM lookup performance improvement on mapblock loading
This commit is contained in:
parent
fe41725e50
commit
396daf1be1
|
@ -262,16 +262,25 @@ void LBMManager::applyLBMs(ServerEnvironment *env, MapBlock *block, u32 stamp)
|
||||||
MapNode n;
|
MapNode n;
|
||||||
content_t c;
|
content_t c;
|
||||||
lbm_lookup_map::const_iterator it = getLBMsIntroducedAfter(stamp);
|
lbm_lookup_map::const_iterator it = getLBMsIntroducedAfter(stamp);
|
||||||
for (pos.X = 0; pos.X < MAP_BLOCKSIZE; pos.X++)
|
for (; it != m_lbm_lookup.end(); ++it) {
|
||||||
for (pos.Y = 0; pos.Y < MAP_BLOCKSIZE; pos.Y++)
|
// Cache previous version to speedup lookup which has a very high performance
|
||||||
for (pos.Z = 0; pos.Z < MAP_BLOCKSIZE; pos.Z++)
|
// penalty on each call
|
||||||
{
|
content_t previous_c{};
|
||||||
n = block->getNodeNoEx(pos);
|
std::vector<LoadingBlockModifierDef *> *lbm_list = nullptr;
|
||||||
c = n.getContent();
|
|
||||||
for (LBMManager::lbm_lookup_map::const_iterator iit = it;
|
for (pos.X = 0; pos.X < MAP_BLOCKSIZE; pos.X++)
|
||||||
iit != m_lbm_lookup.end(); ++iit) {
|
for (pos.Y = 0; pos.Y < MAP_BLOCKSIZE; pos.Y++)
|
||||||
const std::vector<LoadingBlockModifierDef *> *lbm_list =
|
for (pos.Z = 0; pos.Z < MAP_BLOCKSIZE; pos.Z++) {
|
||||||
iit->second.lookup(c);
|
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)
|
if (!lbm_list)
|
||||||
continue;
|
continue;
|
||||||
for (std::vector<LoadingBlockModifierDef *>::const_iterator iit =
|
for (std::vector<LoadingBlockModifierDef *>::const_iterator iit =
|
||||||
|
@ -279,7 +288,7 @@ void LBMManager::applyLBMs(ServerEnvironment *env, MapBlock *block, u32 stamp)
|
||||||
(*iit)->trigger(env, pos + pos_of_block, n);
|
(*iit)->trigger(env, pos + pos_of_block, n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue