動くオブジェクトがたくさんある四分木


7

私がやろうとしていることに非常に役立つクアッドツリーの実装があります。私の問題は、ビューポートに多くのオブジェクトがある場合、クアッドツリーの更新に非常に長い時間がかかることです。

非静的オブジェクトの場合、クワッドツリーが遅いことは既知の事実です。高速化するためにいくつかの方法を試しましたが、実際には、多数のオブジェクトを非常に頻繁に更新する必要があります。

代わりに私が見ているより良いアルゴリズムはありますか?あなたが知っているいくつかの派生したクワッドツリー実装はありますか?


こちらもご覧ください。gamedev.stackexchange.com
20011

回答:


13

Quad Treeオブジェクトをどのように移動していますか?最も簡単な(そして最も遅い)方法は、オブジェクトを削除して再挿入することです。オープンソースのXNA Quad Treeと私が作った友達は、オブジェクトが移動したときに少しロジックを実行します。

If the object is still inside the same quad
    if the object fits into a child quad
        Add to child
Else
    move the object to the parent(s) until it fits, and optionally going back down into children

すでにそのようなことをしている場合は、空間ハッシュなどの他の空間インデックスメソッドを検討する価値があります。


うわー、これはとても奇妙です。あなたがこれを投稿する少し前に、私はこの実装を偶然見つけました。私はこのバージョンを実装し始めて、速度が上がるかどうかを確認しました。これは素晴らしい仕事です。
jgallant

1
@ジョン、イェイ、助けてよかった。ところで、DLLをそこに移動することで小さなバグがありました(r20)。ソースをダウンロードします(r22)。
ジョンマクドナルド

ああ、ソースのrev22をダウンロードしました。DLLについても気にしませんでした。しかし、それを指摘してくれてありがとう。
jgallant

くそー、私はすべてのUpdate()呼び出しで膨大な量のデータを更新しています。あなたは男です。
jgallant

すばらしいです。問題が発生した場合はお知らせください。
ジョンマクドナルド

3

私はオブジェクトの境界を使用し、それらを含む最も深いクワッドにそれらを挿入します。(私は物事をポイントとして扱うことに慣れたことがありません)

高速で移動するオブジェクト(通常は弾丸など)も小さいので、いくつかのタイムステップまたは最大サイズでパスの境界を計算します。そのため、小さな正方形ではなく大きな長方形で弾丸をバインドし、ほぼ同じ頻度で移動します。

また、移動コード自体を最適化して、オブジェクトを削除して再挿入するのではなく、インテリジェントに移動することもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.