更有效地迭代

时间:2014-01-04 18:08:24

标签: c++ collision

有没有办法更有效地迭代我的碰撞? 因为在250个物体上,这意味着250 * 250 == 62500碰撞检查,这使我的游戏滞后。

int sz = (int)objects.size();
for (int i = 0 ; i < sz ; ++i) {
    GameObject *iter = objects[i];

    if (!(iter)->Collidable()) { continue; }

    for (int i2 = i + 1 ; i2 < sz ; ++i2) {
        GameObject *iter2 = objects[i2];

        if (!(iter2)->Collidable()) { continue; }

        if ((iter)->CheckCollisions((iter2))) {
            (iter)->Collided((iter2)->GetID(), (iter2));
            (iter2)->Collided((iter)->GetID(), (iter));
        }
    }
}

2 个答案:

答案 0 :(得分:2)

考虑查看quadtrees(或3D,八叉树)。

这些是根据相对位置对事物进行分组的数据结构,从而通过仅将它们集中在实际可能发生碰撞的事物上来减少您需要进行的比较次数。

答案 1 :(得分:0)

我首先实现像octree这样的空间分区算法,然后我将实现不同级别的碰撞检测。例如,球体碰撞是最便宜的,然后盒子碰撞跟进,之后只有当物体首次通过球体碰撞测试时才能获得更精确的碰撞。

以下是两个球体3d-Sphere collisions的碰撞测试链接。