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
のを待ってビジーである可能性があることです。ただし、再描画に 1000 / 20 秒以上かかる場合は別のケースがあります。これは、アニメーションが常にシームレスであるとは限らないことを意味します。エミュレーターで試してみましたが、通常は問題ありませんが、速度が低下することがあります。その後、約 0.5 秒間速度が上がります。これは単なるエミュレーターですか、それとも何か他のものですか?(now - lastUpdate > UPDATE_INTERVAL)
true
Drawable
詳細については気にしませんupdatePieces()
。上から下に小さな円を移動するだけです。私は新しいオブジェクトを作成していません。どういうわけか、このコードは正しくない気がします。これは s をアニメーション化するための良い習慣Drawable
ですか、それとも明らかな何かが欠けていますか? 私はこのトピックではちょっと新しいです。
UI スレッドからこれにタッチ イベントとキー イベントを伝達するので、UI スレッドが応答しなくなる可能性があるためsleep()
、これを呼び出したくありません。Thread