2011-12-27 18 views
2

У меня возникли проблемы с созданием базовой игровой петли для моей игры. Я нахожусь на ранней стадии, и все, что я хочу сделать, - это перемещать мяч с постоянной скоростью (например: 3) в нижней части экрана. Положение мяча обновляется в методе обновления основной панели, и оно отображается в части рендеринга, как ожидалось. Ничего исключительного в механизме. Шарик движется, но он определенно не является гладким, визуальный тихий, тревожный. Я измерил времена реализации этих методов, и общее время реализации этой пары составляет около 3-4 миллисекунд. В этих условиях, что такое подходящий FPS? Соответствуют ли заданные постоянные значения Что не хватает или неправильно в моем механизме? Заранее большое спасибо. блок кода в основном потоке.Android FPS, как сделать его более плавным?

private final static int MAX_FPS = 200; 
private final static int FRAME_PERIOD = 1000/MAX_FPS; 
private final static int MAX_FRAME_SKIPS = 5; 

public void run() { 

    initTimingElements(); 
    long beginTime; 
    long timeDiff; 
    int sleepTime; 
    int framesSkipped; 
    long beginTime2; 

    long diff1; 
    long diff2; 

    sleepTime = 0; 

    Canvas canvas; 
    Log.d(TAG, "Starting game loop"); 
    while (running) { 
     canvas = null; 
     try { 
      canvas = this.surfaceHolder.lockCanvas(); 
      synchronized (surfaceHolder) { 
       beginTime = System.currentTimeMillis(); 
       framesSkipped = 0; 

       this.gamePanel.update(); 
       diff1=System.currentTimeMillis()-beginTime; 
       beginTime2=System.currentTimeMillis(); 
       this.gamePanel.render(canvas); 
       diff2=System.currentTimeMillis()-beginTime2; 



       timeDiff = System.currentTimeMillis() - beginTime; 
       sleepTime = (int) (FRAME_PERIOD - timeDiff); 

       if (sleepTime > 0) { 
        try { 
         Thread.sleep(sleepTime); 
        } catch (InterruptedException e) { 
        } 
       }     
       while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) { 
        this.gamePanel.update(); 
        sleepTime += FRAME_PERIOD; 
        framesSkipped++; 
       } 
       if (framesSkipped > 0) { 
        Log.d(TAG, "Skipped:" + framesSkipped); 
       } 
       framesSkippedPerStatCycle += framesSkipped; 
       storeStats(); 
      } 
     } finally { 
      if (canvas != null) { 
       surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
} 
+0

Посмотрите на [это] (http://www.youtube.com/watch?v=wJYTBjMZJh0) видео (около отметки 34:07). Я не делаю анимации самостоятельно, но это может относиться к вашему ситуация. –

ответ

-1

Попробуйте использовать TimerTask, который срабатывает каждые 60 м или около того.
Это то, что я делаю, пока не перестаю быть ленивым, чтобы сделать правильную реализацию, но это работает хорошо. Просто помните, что run() будет выполняться в другом потоке, поэтому используйте runOnUIThread() для запуска любого кода, который вам нужен.

+0

Я не мог получить его приятель, механизм игры обрабатывается методом запуска другого потока, используя метод запуска потока пользовательского интерфейса, блокирует механизм? можете ли вы объяснить свой ответ простым алгоритмом? – user1111781

+0

Ну, вам придется много поиграть, чтобы получить его. Избавьтесь от вызова сна, также STRICTLY обрабатывайте логику игры в другом потоке и делайте рисование в обычном потоке пользовательского интерфейса, рисуя как можно быстрее. Есть несколько проблем: отделить рисунок от логики, вычислить логику каждые 60 кадров в секунду и сделать как можно быстрее или когда сцена изменилась. Заблокируйте свою сцену и, возможно, используйте буфер для продолжения рисования, пока идет логический поток. Удачи –

Смежные вопросы