2010-03-20 39 views
2

我正在開發一款適用於Android的國際象棋遊戲(http://androidchess.appspot.com),使用SurfaceView作爲棋盤。我有一張圖畫Thread,它將棋盤畫成一個循環。問題在於,如果沒有活動動畫(90%以上的時間),將CPU和電池浪費在繪圖上是沒有意義的。我應該如何解決這個問題?也許以某種方式暫停和恢復圖紙Thread暫停和恢復線程繪製到SurfaceView

+0

@fhucho我有一個簡單的例子,你...看到我的答案更多的細節。 – Kiril 2010-03-20 16:48:07

回答

3

嘗試是這樣的(你可以通過嘗試this code測試):

final Object monitor = new Object(); 

class Drawing implements Runnable 
{ 
    @override 
    void run() 
    { 
     while(true) 
     { 

      synchronized(monitor) 
      { 
       monitor.wait(); 
      } 

      // draw 
     } 
    } 
} 

public static void main(String[] args) { 

    // start your thread 
    while(true) 
    { 
     if(needRefresh) 
     { 
      synchronized(monitor) 
      { 
       monitor.notify(); 
      } 
     } 
    } 
} 

我會建議使用Semaphore,如果你想一次信號,然後不斷吸引(即不阻塞),直到信號已關閉。

+0

謝謝,等待/通知正是我一直在尋找的東西。 – fhucho 2010-03-20 19:09:56

0

你幾乎自己回答了這個問題。當沒有渲染任何東西時,你應該暫停你的繪圖線程。當使用OpenGL SurfaceView時,您還可以使用立即模式(連續繪製)或手動(按請求繪製)。

+0

但我應該如何暫停/恢復線程?根據Android的文檔,Thread.suspend()已被棄用。 – fhucho 2010-03-20 15:09:34

+0

從lirik上面的方法我會工作。另一種更現代的方法是將java併發類與Lock/Condition或類似方法結合使用。 – Moritz 2010-03-20 18:51:39