4

私は幼稚な小さなプログラムに取り組んできました。画面上にさまざまな色とサイズの小さな円がたくさんあります。大きな円が小さな円に遭遇すると、小さな円を食べ、円が十分に他の円を食べたとき、それは再生します. なんだかスッキリ!

ただし、私が実装した方法では、近くのサークルを検出して食用かどうかをチェックするプロセスは、生きているサークルの人口全体を循環する for ループで行われます...人口が急増する傾向があるため、ますます時間がかかります落ち始める前の3000。このプロセスによってコンピューターの速度が低下することはありません。Dawn of War などをプレイできますが、速度が低下することはありません。すべての円をチェックして、他のすべての円と衝突したかどうかを確認するプロセスです.. .

そこで私が思いついたのは、アプリケーション ウィンドウを 4 つの象限に分割し、象限内の円に同時にチェックを行わせることができるということです。これは、相互に干渉する可能性がほとんどないためです。 !

私の質問は次のとおりです。並んで実行される for ループを作成するにはどうすればよいでしょうか。Java で言えば、

4

7 に答える 7

9

ここでの問題は、実際にはスレッドなしで解決できます。

必要なのは、空間データ構造です。四分木が最適です。または、球体が移動するフィールドが固定されている場合 (固定されていると思います)、単純なグリッドを使用できます。これがアイデアです。

表示領域を正方形のグリッドに分割し、各セルが少なくとも最大の円と同じ大きさになるようにします。各セルについて、中心がそのセルにあるすべての円のリスト (リンクされたリストが最適) を保持します。次に、衝突検出ステップ中に、各セルを調べて、そのセル内の各円を、そのセルおよび周囲のセル内の他のすべての円に対してチェックします。

技術的には、各セルの周りのすべてのセルをチェックする必要はありません。それらの一部は既にチェックされている可能性があるためです。

この手法をマルチスレッド手法と組み合わせて、さらに優れたパフォーマンスを得ることができます。

于 2008-11-08T07:16:16.380 に答える
8

通常、コンピュータはシングル タスクです。これは、通常、CPU またはコアごとに一度に 1 つの命令を実行できることを意味します。

ただし、お気付きのように、オペレーティング システム (およびその他のプログラム) は同時に多くのタスクを実行しているように見えます。

これは作業をプロセスに分割することで実現され、各プロセスはスレッドを生成することで並行性をさらに実装できます。オペレーティング システムは、マルチタスクの錯覚を与えるために、各プロセスとスレッドを非常に迅速に切り替えます。

あなたの状況では、Java プログラムは単一のプロセスであり、それぞれ独自のループを実行する 4 つのスレッドを作成する必要があります。スレッドはローカル変数へのアクセスを同期する必要があるため、別のスレッドが変数にアクセスしようとしている間にあるスレッドが変数を編集するのを防ぐために、注意が必要です。

スレッド化は複雑なテーマであるため、ここで説明するよりもはるかに多くの説明が必要です。

ただし、知っておく必要があるすべてをカバーしている同時実行に関する Sun の優れたチュートリアルを読むことができます。

http://java.sun.com/docs/books/tutorial/essential/concurrency/

于 2008-11-08T06:51:04.403 に答える
5

あなたが探しているのは、これらを同時に実行する方法ではありません (人々が指摘したように、これはコアの数に依存し、2 倍または 4 倍のスピードアップしか提供できません)。検出する必要がある衝突の数。

quadtreeの使用を検討する必要があります。簡単に言うと、(必要に応じて) 2D 領域を 4 つの象限に再帰的に分割し、近くのコンポーネント内のオブジェクト間の衝突を検出するだけで済みます。場合によっては、衝突検出時間を N^2 から N * log N に効果的に短縮できます。

于 2008-11-08T07:00:31.950 に答える
1

並列処理を試みる代わりに、衝突検出の最適化を探すことができます。多くの場合、複数のスレッドに計算を分散するよりも、1 つのスレッドで実行する計算を少なくする方がよいためです。また、このマルチスレッド ビジネスでは、自分自身を簡単に撃ち落とすことができます。「衝突検出アルゴリズム」をグーグルで検索してみてください;)

于 2008-11-08T18:23:27.623 に答える
0

これは私の実験と非常によく似ています-チェックしてください...

http://tinyurl.com/3fn8w8

私は四分木にも興味があります(それが私がここにいる理由です)...あなたがそれをすべて理解したことを願っています。

于 2009-08-25T08:04:32.203 に答える
0

コンピューターに複数のプロセッサまたは複数のコアがある場合、複数のスレッドを簡単に実行し、各スレッドでループの小さな部分を実行できます。最近の多くの PC には複数のコアが搭載されています。そのため、各スレッドがループ カウントの 1/n を取得し、n スレッドを作成するようにします。

于 2008-11-08T06:50:32.470 に答える
0

本当に並行プログラミングを始めたいのなら、スレッドの使い方を学ぶ必要があります。

Sun には、Java スレッドのプログラミングに関するチュートリアルがあります: http://java.sun.com/docs/books/tutorial/essential/concurrency/

于 2008-11-08T06:52:38.440 に答える