Stop wasting time in abm - performance improvement
authorCiaran Gultnieks <ciaran@ciarang.com>
Mon, 3 Mar 2014 18:43:53 +0000 (18:43 +0000)
committersapier <Sapier at GMX dot net>
Thu, 6 Mar 2014 18:18:36 +0000 (19:18 +0100)
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

src/environment.cpp

index 0e7830a264dc78a409f98bb4e2d5b72b61562af5..9f7207b8d8533fa5c90d3466b36dad26c1912b9c 100644 (file)
@@ -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,