2013-08-23 150 views
0

我正在爲Android開發一款相對較小的2D遊戲。爲了儘可能高效地處理碰撞檢測,我創建了多個線程來處理計算:Android,多線程,同步

線程#1:主要處理幀,將它們限制爲每秒X,處理位圖(旋轉,繪製。 ..) 線程#2:計算一些衝突 線程#3:計算其他衝突

我需要的是某種同步,但我不確定什麼是實現此目的的最佳方法。我認爲是這樣的:

線程#1:

public class Thread1 imlements Runnable { 
    public static ArrayList<Boolean> ResponseList = new ArrayList<Boolean>(); 
    static { 
     ResponseList.add(0, false); // index 0 -> thread 1 
     ResponseList.add(1, false); // index 1 -> thread 2 
    } 
    public void run() { 
     boolean notFinished; 
     while(!isInterrupted() && isRunning) { 
      notFinished = true; 
      // do thread-business, canvas stuff, etc, draw 



      while(notFinished) { 
       notFinished = false; 
       for(boolean cur: ResponseList) { 
        if(!cur) notFinished = true; 
       } 
       // maybe sleep 10ms or something 
      } 
     } 
    } 
} 

而在其他的計算線程是這樣的:

public class CalcThread implements Runnable { 
    private static final INDEX = 0; 

    public void run() { 
     while(isRunning) { 
      ResponseList.set(INDEX, false); 
      executeCalculations(); 
      ResponseList.set(INDEX, true); 
     } 
    } 
} 

或者,它會更快(因爲這是我m關心)使用Looper/Handler組合?剛剛閱讀了這個,但我不知道如何實現這一點。會更深入地看到這是更有效的方法。

回答

0

我不知道它是否會更快,但它肯定會更可靠。例如,您正在使用ArrayList,而不使用序列化來處理多個線程,並且ArrayList不是線程安全的

Handler只是其中一種可用的機制,我建議您學習java.util.concurrent - 重新發明輪子沒有意義,許多同步原語已經可用。也許Future會爲你工作

Future表示異步計算的結果。提供的方法用於檢查計算是否完成,是否等待完成以及檢索計算結果。

+0

好吧,但這意味着我將不得不重新創建每個幀的計算線程,不是嗎?我目前的設置有三個線程在任何時候運行..是否有任何方便的方法讓主線程等待兩個子線程完成,以及子線程等待,直到父線程「發信號」他們再次工作? – damian

+0

我現在已經與CyclicBarrier解決了。似乎是正確的。但是謝謝你! – damian