2

私は単純なスペース シューターに取り組んできましたが、プロジェクトの途中で、ひどく書かれたコードが実際に速度を低下させているところまで来ました。EQATEC を実行した後、問題の大部分は、すべての衝突検出に関する厄介なすべてのチェックにあることがわかりました。QuadTree を配置することを検討していましたが、衝突の大部分は小惑星上にあり、頻繁に移動します (多くの更新が必要になります)。私の次の選択肢は、衝突チェック自体をマイクロ最適化することでした。ここにあります:

    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

実際の距離の代わりに距離の 2 乗を計算し、それを衝突しきい値の 2 乗と比較します。それは少し速くなるはずです。ほとんどの小惑星が同じサイズである場合、再計算せずに衝突しきい値に同じ値を再利用できます。

もう 1 つの便利な方法は、最初にバウンディング ボックスに基づいて簡単なチェックを行い、バウンディング ボックスが交差する場合にのみ距離を計算することです。そうでない場合は、2 つのオブジェクトが衝突していないことがわかります (安上がりです)。

于 2013-05-13T22:44:46.420 に答える