我正在制作棋盘游戏。电路板永远不会移动,但它上面的碎片有时会取决于用户的互动。还有一些UI元素可能会定期更新。
现在我设置的方式是覆盖onDraw()
子类的SurfaceView
方法。我有一个绘图线程,在while循环中不断调用postInvalidate()
:
class PanelThread extends Thread
{
//...
long sleepTime = 0;
long nextGameTick = System.currentTimeMillis();
@Override
public void run()
{
Canvas c;
while (_run)
{ // When setRunning(false) occurs, _run is
c = null; // set to false and loop ends, stopping thread
try
{
c = _surfaceHolder.lockCanvas(null);
synchronized (_surfaceHolder)
{
// Insert methods to modify positions of items in onDraw()
_panel.postInvalidate();
}
} finally
{
if (c != null)
{
_surfaceHolder.unlockCanvasAndPost(c);
}
}
}
nextGameTick += MILLISECONDS_PER_FRAME;
sleepTime = nextGameTick - System.currentTimeMillis();
if(sleepTime >= 0)
{
try
{
sleep(sleepTime, 0);
} catch (InterruptedException e)
{
continue;
}
}
else
{
//we're behind, oh well.
System.out.println("behind!");
nextGameTick = System.currentTimeMillis();
}
}
}
这样效率不高,占用了大量CPU。是否有一种简单的方法让android只在更改时更新?
答案 0 :(得分:2)
你有正确的想法,但它需要一些改进。
你肯定要不想要尽可能快地循环,因为CPU可以处理它。 你应该在每个循环中暂停你的线程一段时间。你肯定不需要每毫秒都在你的循环中做所有事情。
我发现这个guide to FPS control对于设计游戏循环非常有帮助。
这个Android-specific game loop guide还提供了很多很棒的示例代码和深入的解释。