瀏覽代碼

improve performance of entity collision detection

Kolja Strohm 1 月之前
父節點
當前提交
ab8df8a577
共有 3 個文件被更改,包括 33 次插入28 次删除
  1. 0 2
      FactoryCraft/Dimension.cpp
  2. 29 24
      FactoryCraft/Entity.cpp
  3. 4 2
      FactoryCraft/Entity.h

+ 0 - 2
FactoryCraft/Dimension.cpp

@@ -336,8 +336,6 @@ void Dimension::entityTickLoop()
         zm.messungEnde();
         double seconds = zm.getSekunden();
         zm.messungStart();
-        Logging::debug() << "Dimension " << this->getDimensionId()
-                         << " entity tick loop took " << seconds << " seconds.";
         entityCs.lock();
         chunkCs.lock();
         for (auto entity : *entities)

+ 29 - 24
FactoryCraft/Entity.cpp

@@ -255,7 +255,9 @@ Entity::Entity(
       jumpSpeed(0.f),
       id(entityId),
       placeBlockCooldown(0.0),
-      movementFlags(0)
+      movementFlags(0),
+      collisionMap(0),
+      collisionMapLength(0)
 {}
 
 void Entity::onDeath(Entity* zActor, Item* zUsedItem, ItemSkill* zUsedSkill)
@@ -588,7 +590,7 @@ ItemSkill* Entity::zSkill(int itemType)
     return 0;
 }
 
-void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
+void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl)
 {
     Framework::Vec3<float> minXY = -boundingBox;
     Framework::Vec3<float> maxXY = boundingBox;
@@ -621,20 +623,25 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
     if (yl < (int)maxXY.y) yl = (int)maxXY.y;
     xl = xl - x + 1;
     yl = yl - y + 1;
-    *map = new bool[xl * yl];
-    memset(*map, 0, xl * yl * sizeof(bool));
+    if (collisionMapLength < xl * yl)
+    {
+        delete[] collisionMap;
+        collisionMap = new bool[xl, yl];
+        collisionMapLength = xl * yl;
+    }
+    memset(collisionMap, 0, xl * yl * sizeof(bool));
     int xi = (int)minXY.x - x;
     int yi = (int)minXY.y - y;
-    (*map)[xi + yi * xl] = 1;
+    collisionMap[xi + yi * xl] = 1;
     xi = (int)maxXY.x - x;
     yi = (int)maxXY.y - y;
-    (*map)[xi + yi * xl] = 1;
+    collisionMap[xi + yi * xl] = 1;
     xi = (int)minXmaxY.x - x;
     yi = (int)minXmaxY.y - y;
-    (*map)[xi + yi * xl] = 1;
+    collisionMap[xi + yi * xl] = 1;
     xi = (int)maxXminY.x - x;
     yi = (int)maxXminY.y - y;
-    (*map)[xi + yi * xl] = 1;
+    collisionMap[xi + yi * xl] = 1;
     auto dir = minXmaxY - minXY;
     float m = 0;
     if (abs(dir.x) >= abs(dir.y))
@@ -648,7 +655,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
         {
             int xi = xx - x;
             int yi = (int)yy - y;
-            (*map)[xi + yi * xl] = 1;
+            collisionMap[xi + yi * xl] = 1;
             yy += m;
         }
     }
@@ -663,7 +670,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
         {
             int xi = (int)xx - x;
             int yi = yy - y;
-            (*map)[xi + yi * xl] = 1;
+            collisionMap[xi + yi * xl] = 1;
             xx += m;
         }
     }
@@ -680,7 +687,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
         {
             int xi = xx - x;
             int yi = (int)yy - y;
-            (*map)[xi + yi * xl] = 1;
+            collisionMap[xi + yi * xl] = 1;
             yy += m;
         }
     }
@@ -695,7 +702,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
         {
             int xi = (int)xx - x;
             int yi = yy - y;
-            (*map)[xi + yi * xl] = 1;
+            collisionMap[xi + yi * xl] = 1;
             xx += m;
         }
     }
@@ -712,7 +719,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
         {
             int xi = xx - x;
             int yi = (int)yy - y;
-            (*map)[xi + yi * xl] = 1;
+            collisionMap[xi + yi * xl] = 1;
             yy += m;
         }
     }
@@ -727,7 +734,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
         {
             int xi = (int)xx - x;
             int yi = yy - y;
-            (*map)[xi + yi * xl] = 1;
+            collisionMap[xi + yi * xl] = 1;
             xx += m;
         }
     }
@@ -744,7 +751,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
         {
             int xi = xx - x;
             int yi = (int)yy - y;
-            (*map)[xi + yi * xl] = 1;
+            collisionMap[xi + yi * xl] = 1;
             yy += m;
         }
     }
@@ -759,7 +766,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
         {
             int xi = (int)xx - x;
             int yi = yy - y;
-            (*map)[xi + yi * xl] = 1;
+            collisionMap[xi + yi * xl] = 1;
             xx += m;
         }
     }
@@ -769,7 +776,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
         int max = -1;
         for (int xx = 0; xx < xl; xx++)
         {
-            if ((*map)[xx + yy * xl])
+            if (collisionMap[xx + yy * xl])
             {
                 if (xx < min) min = xx;
                 if (xx > max) max = xx;
@@ -777,7 +784,7 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
         }
         for (int xx = min; xx <= max; xx++)
         {
-            (*map)[xx + yy * xl] = 1;
+            collisionMap[xx + yy * xl] = 1;
         }
     }
 }
@@ -785,21 +792,19 @@ void Entity::calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map)
 bool Entity::isCollidingWithBlock(const Dimension* zDimension)
 {
     int x, y, xl, yl;
-    bool* map;
-    calcBlockCollision(x, y, xl, yl, &map);
-    bool result = isCollidingWithBlock(zDimension, x, y, xl, yl, map);
-    delete[] map;
+    calcBlockCollision(x, y, xl, yl);
+    bool result = isCollidingWithBlock(zDimension, x, y, xl, yl);
     return result;
 }
 
 bool Entity::isCollidingWithBlock(
-    const Dimension* zDimension, int x, int y, int xl, int yl, bool* map)
+    const Dimension* zDimension, int x, int y, int xl, int yl)
 {
     for (int yy = 0; yy < yl; yy++)
     {
         for (int xx = 0; xx < xl; xx++)
         {
-            if (map[xx + yy * xl])
+            if (collisionMap[xx + yy * xl])
             {
                 for (int zz = (int)(location.z - boundingBox.z);
                     zz <= (int)(location.z + boundingBox.z);

+ 4 - 2
FactoryCraft/Entity.h

@@ -92,6 +92,8 @@ protected:
     Framework::Vec3<float> boundingBox;
     float rotation;
     int movementFlags;
+    bool* collisionMap;
+    int collisionMapLength;
 
     virtual void onDeath(
         Entity* zActor, Item* zUsedItem, ItemSkill* zUsedSkill);
@@ -103,10 +105,10 @@ protected:
     void calculateTarget(const Item* zItem);
     void notifyStatusBarObservers(NetworkMessage* msg);
     ItemSkill* zSkill(int itemType);
-    void calcBlockCollision(int& x, int& y, int& xl, int& yl, bool** map);
+    void calcBlockCollision(int& x, int& y, int& xl, int& yl);
     bool isCollidingWithBlock(const Dimension* zDimension);
     bool isCollidingWithBlock(
-        const Dimension* zDimension, int x, int y, int xl, int yl, bool* map);
+        const Dimension* zDimension, int x, int y, int xl, int yl);
 
 public:
     virtual void prepareTick(const Dimension* zDimension, double seconds);