2010-03-20 119 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