我正在寫一個基於LunarLander示例項目的小程序。我想實現的是固定間隔之間更新我SurfaceView
(重新定位一些Drawable
旗下主要)像這樣的:如何在Android中更新固定間隔的SurfaceView?
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
或我失去了明顯的東西?我在這個話題上有點新鮮。
我將觸摸和按鍵事件從UI線程傳播到這個,所以我不想在Thread
中調用sleep()
,因爲它可能會導致UI線程無響應。
這是有道理的。無論如何,只要不降低太多,我並不關心幀速率。我現在只有速度,沒有加速度(所以它是1)。 – 2012-08-15 12:15:25
感謝您的詳細解釋,+1! – 2012-08-15 12:17:11