2008-11-08 58 views
4

我一直在做一個幼稚的小程序:屏幕上有一堆小圓圈,有不同的顏色和大小。當一個較大的圓圈遇到一個較小的圓圈時,它會吃掉較小的圓圈,並且當一個圓圈吃了足夠多的其他圓圈時,它就會重現。它很整潔!如何讓循環並排運行?

然而,我實施它的方式,檢測附近的圓和檢查它們的可編輯性的過程是通過一個for循環來完成的,循環遍歷整個活着的人羣......這需要更長和更長的人口在它開始下降之前趨於攀升到3000點。這個過程不會減慢我的計算機速度,我可以去玩戰爭黎明之類的東西,也沒有任何減速過程:它只是檢查每個圓圈,看它是否與其他圓圈相撞。

所以我發現,我可以嘗試將應用程序窗口分成四個象限,象限中的圓圈同時進行檢查,因爲它們幾乎不會互相干擾:或者是那個效果!

那麼我的問題是:如何讓並排運行的循環?在Java中,說。

+1

請記住,如果您更改自己的圈子程序,以便使用CPU上的所有核心,則可能會開始影響戰爭黎明。要小心你想要的:-) – 2008-11-08 14:02:23

+0

這些圈子在移動嗎?隨機?我想你應該在提出我的建議之前先說一點。 – 2008-11-08 20:25:39

回答

8

計算機通常是單一任務,這意味着他們通常可以每個CPU或核心一次執行一條指令。

但是,正如您已經注意到的,您的操作系統(和其他程序)似乎同時運行許多任務。

這是通過將工作分成進程來完成的,每個進程都可以通過產生線程來進一步實現併發。操作系統然後在每個進程和線程之間切換,非常快速地給出多任務的錯覺。

在你的情況下,你的java程序是一個單獨的進程,你需要創建4個線程,每個線程運行自己的循環。它可能會變得棘手,因爲線程需要將它們的訪問同步到本地變量,以防止一個線程在另一個線程嘗試訪問它時編輯變量。

因爲線程是一個複雜的主題,所以需要比我能做的更多的解釋。

但是,你可以閱讀太陽的併發性,從而涵蓋一切優秀教程,你需要知道:

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

+0

只要知道這是什麼,這個「線程」,是足夠的信息,我可以開始學習更多關於它:謝謝!通常只是不知道這個詞是能夠學習而不知道的障礙。 – Ziggy 2008-11-09 10:30:57

0

如果您的計算機有多個處理器或多個內核,那麼您可以輕鬆地運行多個線程並在每個線程中運行較小部分的循環。現在許多PC都擁有多個內核,因此每個線程都有1個循環次數,然後創建n個線程。

5

什麼你要找的是不是一個辦法讓這些同時運行(如人都注意到,這取決於你有多少個核心,並且只能提供2倍或者4倍的加速),而是以某種方式減少你必須檢測的碰撞次數。

你應該看看使用quadtree。簡而言之,您遞歸地將2D區域分解爲四個象限(根據需要),然後只需檢測附近組件中物體之間的碰撞。在很好的情況下,它可以有效地將您的碰撞檢測時間從N^2減少到N * log N.

9

您在這裏遇到的問題實際上可以在沒有線程的情況下解決。

你需要的是一個空間數據結構。四叉樹是最好的,或者如果領域移動的領域是固定的(我假設它是),你可以使用一個簡單的網格。繼承人的想法。

將顯示區域劃分爲一個正方形網格,其中每個單元至少與您的最大圓形一樣大。對於每個單元格,其中心都在該單元格內的所有圓圈都保留一個列表(鏈接列表最好)。然後在碰撞檢測步驟中通過每個單元格並檢查該單元格中的每個圓圈與該單元格中的所有其他圓圈以及周圍的單元格。

從技術上講,您不必檢查每個單元周圍的所有單元,因爲其中一些單元可能已被檢查。

您可以將此技術與多線程技術結合使用,以獲得更好的性能。

1

您可能想要尋找碰撞檢測優化,而不是嘗試進行並行處理。因爲在很多情況下,在一個線程中執行較少的計算要比在多個線程中分配計算要好,此外在這個多線程業務中很容易讓自己處於困境。嘗試谷歌搜索「碰撞檢測算法」,看看它可以讓你;)

0

這聽起來非常相似,我的一個實驗 - 檢查出來...

http://tinyurl.com/3fn8w8

我也有興趣在quadtrees(這就是爲什麼我在這裏)......希望你能把它全部弄清楚。