有些设备没有正确的时间

时间:2015-03-04 18:20:42

标签: java android thread-sleep game-loop

我正在开发一款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");
            }

        }

0 个答案:

没有答案