我正在开发一个使用Canvas/Surfaceview的2d游戏,线程有问题。因此,我想要在后台完成一些事情,例如:每一秒SpawnEnemy()或滴答秒或攻击。
我尝试了Thread.wait,但那只会造成痛苦,并使我的游戏成为2fps。
这是我的gameLoop:
import android.graphics.Canvas;
public class GameLoopThread extends Thread {
static final long FPS = 20;
private GameView view;
private boolean running = false;
public GameLoopThread(GameView view) {
this.view = view;
}
public void setRunning(boolean run) {
running = run;
}
@Override
public void run() {
long ticksPS = 1000 / FPS;
long startTime;
long sleepTime;
while (running) {
Canvas c = null;
startTime = System.currentTimeMillis();
try {
c = view.getHolder().lockCanvas();
synchronized (view.getHolder()) {
view.onDraw(c);
}
} finally {
if (c != null) {
view.getHolder().unlockCanvasAndPost(c);
}
}
sleepTime = ticksPS - (System.currentTimeMillis() - startTime);
try {
if (sleepTime > 0)
sleep(sleepTime);
else
sleep(10);
} catch (Exception e) {}
}
}
}所以我想要一些在后台滴答作响的东西(秒),而不是thread.wait。
发布于 2011-09-25 20:23:09
你应该让你的线程正常运行游戏大约60fps,看这个例子:How can I use the animation framework inside the canvas?
如果你想在每一秒做一些事情,那么你可以在onDraw()中计算帧数,在每60帧上这样做,或者如果你需要比每个onDraw()中更高的精度,检查系统时间并在一秒过去的时候做一些事情。
您还应该考虑使用两个方法,一个用于绘制onDraw(),另一个用于从线程调用的游戏逻辑。
发布于 2011-09-25 19:39:46
你可以使用AsyncTask在后台运行一些东西
https://stackoverflow.com/questions/7545235
复制相似问题