我正在编写一个基于 LunarLander 示例项目的小程序。我想要实现的是在像这样的固定间隔之间更新我的SurfaceView
(主要重新定位一些s):Drawable
private static final int UPDATE_INTERVAL = 1000 / 20; // 20 FPS
我正在运行一个Thread
在它的run()
方法中这样做的:
@Override
public void run() {
while (isRunning) {
Canvas c = null;
try {
c = view.getSurfaceHolder().lockCanvas(null);
synchronized (view.getSurfaceHolder()) {
if (GameState.RUNNING.equals(state)) {
long now = System.currentTimeMillis();
if (now - lastUpdate > UPDATE_INTERVAL) {
lastUpdate = now;
updater.updatePieces();
}
doDraw(c);
}
}
} finally {
if (c != null) {
view.getSurfaceHolder().unlockCanvasAndPost(c);
}
}
}
}
我的问题是这可能Thread
正忙于等待(now - lastUpdate > UPDATE_INTERVAL)
条件成为true
。但是如果重绘需要超过 1000 / 20 秒,还有另一种情况。这意味着动画并不总是无缝的。我在我的模拟器中试了一下,通常没问题,但有时我Drawable
的速度变慢了,然后它加速了大约半秒。这只是模拟器还是其他?
我不会在细节上打扰你,updatePieces()
只是从上到下移动一个小圆圈。我没有创建任何新对象。我不知何故觉得这段代码不正确。这是动画Drawable
s 的好习惯还是我遗漏了一些明显的东西?我对这个话题有点陌生。
我将触摸和按键事件从 UI 线程传播到这个线程,所以我真的不想调用sleep()
它,Thread
因为它可能会导致 UI 线程变得无响应。