我正在为一个简单的安卓游戏使用下面的代码作为游戏循环。它可以正常工作,但是偶尔会出现游戏卡顿的情况。所有东西都会冻结一秒钟,然后向前跳了一点比应该更远的距离。我阅读了大量关于游戏循环的资料,但是我仍然有一些困难来实现平滑循环。是否可以通过插值来解决这个问题?我该如何平滑移动?
private final static int MAX_FPS = 30;
private final static int MAX_FRAME_SKIPS = 5;
private final static int FRAME_PERIOD = 1000 / MAX_FPS;
protected Void doInBackground(Void... params) {
Log.d("MainTask", "starting game task");
Canvas canvas;
long begin; // the time when the cycle began
long delta; // the time it took for the cycle to execute
int sleep; // ms to sleep if ahead
int skipped; // number of frames being skipped
sleep = 0;
while (running) {
canvas = null;
try {
canvas = surfaceHolder.lockCanvas();
synchronized (surfaceHolder) {
begin = System.currentTimeMillis();
skipped = 0;
gamePanel.update();
gamePanel.draw(canvas);
delta = System.currentTimeMillis() - begin;
sleep = (int)(FRAME_PERIOD - delta);
if (sleep > 0) {
try {
Thread.sleep(sleep);
} catch(InterruptedException e) {}
}
while (sleep < 0 && skipped < MAX_FRAME_SKIPS) {
gamePanel.update();
sleep += FRAME_PERIOD;
skipped++;
}
}
} finally {
if (canvas != null) surfaceHolder.unlockCanvasAndPost(canvas);
}
}
Log.d("MainTask", "the task is complete");
return null;
}