我正在开发一款Snake游戏。在我的所有设备上,我都有相同的速度。除了我的Nexus 7.游戏运行速度较慢。
我使用System.currenttimemillis()
来计算循环的时间(f.E. 100ms),并获得每个Gameloop始终保持同一时间所需的时间。最后一件事是Thread.sleep()
,直到我有100毫秒,然后是下一个循环。如果没有足够的时间来计算所有内容,我会收到Log.d
消息。
在我的Nexus 7上,我没有收到消息说它很慢,所以它必须有100毫秒,但它比其他设备慢得多。
有谁知道为什么会这样?游戏场大小始终与已经检查的相同。
编辑://
这里是GameLoop里面的代码。我认为Thread.sleep
是问题,但我不确定。
while (running) {
if (gameEnd) {running = false; Log.d("doInBackground","set running false");}
//Spiel Schleife im OnClickListener, OnClick für Pause
int i = 0;
if (!gameEnd | !gameCancel) {
//Spiel läuft
while (!gameEnd & !gameCancel) {
long timeStart = System.currentTimeMillis();
/*
* LOOP for GamePause
*/
if (gamePause) {
PauseTimeStart = System.currentTimeMillis();
while (gamePause) {
//Spielpause, Dialog einblenden, OnClickListener einrichten mit break
if (!gamePauseDialog) {
gamePauseDialog = true;
gameContinues = true;
runOnUiThread(new Runnable() {
@Override
public void run() {
if (gamePause)
{
mHandler.sendEmptyMessage(0);}
}
});
}
}
/*
* LOOP for GamePause END
*
* LOOP GameContinue Start
*/
} else {
//Wird das Spiel fortgestzt gibt es eine 2 Sekündige Unterbrechung bevor es weitergeht
if (gameContinues) {
while (gameContinues) {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
gameContinues = false;
PauseTime = Math.round(PauseTime + System.currentTimeMillis() - PauseTimeStart);
}
/*
* Start of the normal Gameloop without Cancel, Pause and so on
*/
} else { // Start GameLoop
//Richtungwunsch auf andere Variable übertragen danach auf False setzen
// Dadurch sind die Variablen wieder frei für den nächsten Bewegungswunsch auch wenn Update Game noch nicht
// oder gerade durchgeführt wird
Boolean nDown = NextMoveDown;
Boolean nUp = NextMoveUp;
Boolean nLeft = NextMoveLeft;
Boolean nRight = NextMoveRight;
NextMoveDown = false;
NextMoveLeft = false;
NextMoveRight = false;
NextMoveUp = false;
/*
* Drawing Gamefield, updating GameStatus,Move Snake and so on
*/
gameEnd = GamefieldView.updateGame(
nLeft,
nRight,
nUp,
nDown,
gameContinues);
Points = GamefieldView.getPoints();
//Zeitberechnung
//Time = Math.round(i / FPS); BUGGY
//Durchläufe und Punkte an onProgressUpdate() geben
publishProgress(Points);
i++;
gamePauseDialog = false; //Vorsichtshalber gamePauseDialog false setzen, wenn noch true
/*
* Schwierigkeits grad und Thread Sleep
*/
long tickePS = 1000 / FPS;
long timeSleep = tickePS -(System.currentTimeMillis() - timeStart);
//Log.d("Sleeptime", " " + timeSleep + " : " + timeStart + " : " + System.currentTimeMillis() + " : " + tickePS + " : " + (System.currentTimeMillis()-timeStart));
try {
if (timeSleep > 0) {
Thread.sleep(timeSleep);
}
else {
Thread.sleep(10);
Log.e("PERFORMANCE WARNING", "Loop took too long! No.->" + performanceCounter++);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} //Standard Game Loop END
}
} //If !GameEnd | !GameCancel
} else {
//Wenn Spiel beendet oder abgebrochen wurde
Log.d("GameAsyncTask - ", " Gameover");
}
}