2011-07-01 67 views
0

我读过Android上, 游戏编程,他们都提供基本相同的解决方案来绘制游戏,即有专门的线程旋转这样不少教程:高效的Android渲染

public void run() { 
    while(true) { 
     if(!surfaceHolder.getSurface().isValid()) continue; 
     Canvas canvas = surfaceHolder.lockCanvas(); 
     drawGame(canvas); /* do actual drawing here */ 
     surfaceHolder.unlockCanvasAndPost(canvas); 
    } 
} 

现在我想知道,这不就是浪费了?假设我有一个非常简单的图形游戏,所以drawGame中的实际时间很少; 然后我会继续绘制相同的东西,从其他线程窃取cpu; 一种可能性可以跳过图纸和睡眠有点在游戏状态并没有改变, ,我可以通过有状态更新线程mantaining合适的状态标志检查。 但也许还有其他选择。例如,无法与渲染同步, ,以便我不经常发布更新?或者我错过了什么,这正是lockCanvas所做的, 它是否阻止并且在适当的时候没有烧毁cpu?

在此先感谢

L.

回答

0

你并不需要从一个线程循环画的画布,你可以做到这一点要求,在屏幕上移动手指时等。

如果动画不密集,一个可以只使用一个自定义视图,然后无效()的一些用户输入事件的看法。

也可以停止线程,然后创建并再次启动它,因为需要witin相同SurfaceView类很多时间。

1

我会说,你所看到的教程是错误的,你真的想在主循环等待。 16毫秒将是该示例中的目标帧时间下

public void run() { 
    while(true) { 
     long start = System.currentTimeMillis(); 
     if(!surfaceHolder.getSurface().isValid()) continue; 
     Canvas canvas = surfaceHolder.lockCanvas(); 
     drawGame(canvas); /* do actual drawing here */ 
     surfaceHolder.unlockCanvasAndPost(canvas); 
     long frameTime = System.currentTimeMillis() - start; 
     try { 
      Thread.sleep(Math.max(0, 16 - (frameTime))); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
}