2

我一直在研究一个简单的太空射击游戏,并且在项目中我写得非常糟糕的代码实际上正在减慢速度。运行 EQATEC 后,我可以看到大部分问题在于 icky 检查一切碰撞检测的所有内容。我正在考虑放入四叉树,但大多数碰撞都发生在小行星上,它们确实移动了很多(需要大量更新)。我的下一个选择是对碰撞检查本身进行微优化。这里是:

    public bool IsCircleColliding(GameObject obj) //simple bounding circle collision detection check
    {
        float distance = Vector2.Distance(this.WorldCenter, obj.WorldCenter);
        int totalradii = CollisionRadius + obj.CollisionRadius;

        if (distance < totalradii)
            return true;
        return false;
    }

我听说 Vector2.Distance 涉及昂贵的 Sqrt,那么有什么办法可以避免这种情况吗?或者有没有办法使用一些花哨的计算来近似距离?本质上是为了更快的速度。

此外,与实际问题稍微无关的是,是否有一种好的方法(除了 QuadTrees)来对快速移动的对象进行空间分区?

4

1 回答 1

1

计算距离的平方而不是实际距离,并将其与碰撞阈值的平方进行比较。那应该快一点。如果大多数小行星的大小相同,您可以重复使用相同的碰撞阈值值,而无需重新计算。

另一个有用的技巧是首先基于边界框进行简单检查,并仅在边界框相交时计算距离。如果他们没有,那么你知道(便宜)这两个物体没有碰撞。

于 2013-05-13T22:44:46.420 回答