diff options
author | Ciaran Gultnieks <ciaran@ciarang.com> | 2014-03-03 18:43:53 +0000 |
---|---|---|
committer | sapier <Sapier at GMX dot net> | 2014-03-06 19:18:36 +0100 |
commit | db98ef6b4553e7b7cb99589740dc219902a90fbc (patch) | |
tree | b4ad2c4fbedea7c5be61522dbff69c485c73c572 /src | |
parent | a4e2198e4102f1dabc8f8720c2ace9c2fca8d999 (diff) | |
download | minetest-db98ef6b4553e7b7cb99589740dc219902a90fbc.tar.gz minetest-db98ef6b4553e7b7cb99589740dc219902a90fbc.tar.bz2 minetest-db98ef6b4553e7b7cb99589740dc219902a90fbc.zip |
Stop wasting time in abm - performance improvement
Unless I'm mistaken, the chunk of code I'm moving there is potentially
executed hundreds of times inside the loop to get the exact same result
every time
Diffstat (limited to 'src')
-rw-r--r-- | src/environment.cpp | 46 |
1 files changed, 23 insertions, 23 deletions
diff --git a/src/environment.cpp b/src/environment.cpp index 0e7830a26..9f7207b8d 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -719,6 +719,29 @@ public: ServerMap *map = &m_env->getServerMap(); + // Find out how many objects the block contains + u32 active_object_count = block->m_static_objects.m_active.size(); + // Find out how many objects this and all the neighbors contain + u32 active_object_count_wider = 0; + u32 wider_unknown_count = 0; + for(s16 x=-1; x<=1; x++) + for(s16 y=-1; y<=1; y++) + for(s16 z=-1; z<=1; z++) + { + MapBlock *block2 = map->getBlockNoCreateNoEx( + block->getPos() + v3s16(x,y,z)); + if(block2==NULL){ + wider_unknown_count = 0; + continue; + } + active_object_count_wider += + block2->m_static_objects.m_active.size() + + block2->m_static_objects.m_stored.size(); + } + // Extrapolate + u32 wider_known_count = 3*3*3 - wider_unknown_count; + active_object_count_wider += wider_unknown_count * active_object_count_wider / wider_known_count; + v3s16 p0; for(p0.X=0; p0.X<MAP_BLOCKSIZE; p0.X++) for(p0.Y=0; p0.Y<MAP_BLOCKSIZE; p0.Y++) @@ -762,29 +785,6 @@ public: } neighbor_found: - // Find out how many objects the block contains - u32 active_object_count = block->m_static_objects.m_active.size(); - // Find out how many objects this and all the neighbors contain - u32 active_object_count_wider = 0; - u32 wider_unknown_count = 0; - for(s16 x=-1; x<=1; x++) - for(s16 y=-1; y<=1; y++) - for(s16 z=-1; z<=1; z++) - { - MapBlock *block2 = map->getBlockNoCreateNoEx( - block->getPos() + v3s16(x,y,z)); - if(block2==NULL){ - wider_unknown_count = 0; - continue; - } - active_object_count_wider += - block2->m_static_objects.m_active.size() - + block2->m_static_objects.m_stored.size(); - } - // Extrapolate - u32 wider_known_count = 3*3*3 - wider_unknown_count; - active_object_count_wider += wider_unknown_count * active_object_count_wider / wider_known_count; - // Call all the trigger variations i->abm->trigger(m_env, p, n); i->abm->trigger(m_env, p, n, |