@杰森:
这将是一条评论,但它变得太大了,与我刚刚给出的答案不同[更好]。
我已经使用这里描述的这种方法更改了我的实现
http://obviam.net/index.php/the-android-game-loop/
通过使用上述方法意味着您不需要休眠 OnTouch 事件。
别忘了保护你的游戏循环线程,这里提到http://wonton-games.blogspot.com/2010/06/lunar-lander-resume-game-workaround.html
还要记住,Chris Pruett 在编写 Replica Island 时说他使用了 2 个线程,一个用于 update(),另一个用于 render() - 两者都必须受到保护。
Chris 确实让他的 OnTouch 睡眠时间为 16 毫秒 (60 fps) 以减少事件 - 所以我会说如果您仍然需要减少事件,最好尝试一下 - 您只需要在事情发生时触摸屏幕看看它是否滞后并因此在放开时加速。
为了我目前的需要,我使用的线程与我尚未进入 OpenGL 的线程相同,我仍然使用画布。但是当我使用 OpenGL 时,它将是 2 个线程,每个线程都是一个完整的类。
最后,我不是通过计算帧来为我的精灵计时,而是用计时器包裹它们。我将分享我的课程并向您展示我如何称呼它。请记住,我还是 Java 新手,因此为糟糕的代码道歉。
package com.yourname.yourapplication;
//Used for doing something after a set time
public class TimeDo {
private int mRepeat = 0; //Stores the last wait period for the reset() later
private long mTime = 0; //The goal time of when its due
private boolean mFlagged = false; //Stop them getting a second true on a subsequent check
public TimeDo(int milliseconds) {
reset(milliseconds);
}
public TimeDo() {
this(0);
}
public void reset(int milliseconds) {
mRepeat = milliseconds;
mTime = System.currentTimeMillis() + milliseconds;
mFlagged = mRepeat==0; //ignore if zero
}
public void reset() { //Set it back to the delay used last time
reset(mRepeat);
}
public boolean check() {
if (mFlagged) //Assert: shouldn't really happen
return false;
mFlagged = System.currentTimeMillis() > mTime;
return mFlagged;
}
public boolean checkAndReset() {
if (check()) {
reset();
return true;
}
return false; //note mFlagged could be true here, so don't use it
}
}
它是这样实现的:-
public class Gem {
private TimeDo mMoveGem = new TimeDo(100); //move 10 times a second, 100ms
private int mX = 0;
private int mY = 0;
private int mMoveX = 3;
private int mMoveY = 4;
.
.
.
public void update() {
if (mMoveGem.checkAndReset()) {
mX += mMoveX;
mY += mMoveY;
.
.
}
}
public void render(Canvas canvas) {
//etc etc
.
.
}
}
希望对您有所帮助!
抱歉,如果您必须重写很多应用程序 - 我做到了。
编辑:TimeDo 类不是 postDelayed 可运行的,就像自动警报一样。如果您不检查,则不会触发任何“事件”。您可能会感到兴奋并让它创建一个可运行对象并将一个驻留在您的类中的回调方法传递给它(想想 OnClick 方法) - 但会破坏运行更新所有组件的独占 time-able update() 线程的目的。