2010-12-27 1 views
1

Я ищу способ подсчета кадров в секунду в игровых приложениях, проблема в том, что у меня нет исходного кода для любого из этих приложений, у них нет такой функциональности, реализованной внутри. Честно говоря, я действительно не ожидаю, что это станет возможным, но стоило спросить.Рамка в секунду, подсчитываемая в Android-игре

И, чтобы быть совершенно ясным, я понимаю, что мне нужно базовое знание и код основного цикла рисования для подсчета FPS.

С наилучшими пожеланиями

ответ

0

Я не слишком хорошо осведомленный с развитием Android игры, но в Java2D (это немного Hacky, но это работает ...) Я бы xboot баночку с редакцией класса JRE, который контролирует рендеринг (например, Canvas).

1

В чем проблема с подсчетом FPS, когда у вас есть основной цикл рисования (не так ли?).

Я не знаком с функциями Android, но я уверен, что это делается в любой игре на любой ОС. Самый простой способ сделать игру - сделать 2 потока. Первый - для логических действий (расчет траекторий, изменение позиции объекта во времени и т. Д.). Второй поток будет принимать текущее состояние игры (рассчитывается по первому потоку) и нарисовать его на экране.

Вот прокомментировал код на обеих нитей с FPS счетчика:

//Class that contain current game state 
class GameState { 
    private Point objectPosition; 

    public Point getObjectPosition() { 
     return objectPosition; 
    } 

    public void setObjectPosition(Point pos) { 
     this.objectPosition = pos; 
    } 
} 

//Runnable for thread that will calculate changes in game state 
class GameLogics implements Runnable { 
    private GameState gameState; //State of the game 

    public GameLogics(GameState gameState) { 
     this.gameState = gameState; 
    } 

    public void run() { 
     //Main thread loop 
     while (true) { //Some exit check code should be here 
      synchronize (gameState) { 
       gameState.setObjectPosition(gameState.getObjectPosition()+1); //Move object by 1 unit 
      } 
      Thread.sleep(1000); //Wait 1 second until next movement 
     } 
    } 
} 

//Runnable for thread that will draw the game state on the screen 
class GamePainter implements Runnable { 
    private Canvas canvas; //Some kind of canvas to draw object on 
    private GameState gameState; //State of the game 

    public GamePainter(Canvas canvas, GameState gameState) { 
     this.canvas = canvas; 
     this.gameState = gameState; 
    } 

    public void drawStateOnCanvas() { 
     //Some code that is rendering the gameState on canvas 
     canvas.drawLine(...); 
     canvas.drawOtherLine(...); 
     .... 
    } 

    public void run() { 
     //Last time we updated our FPS 
     long lastFpsTime = 0; 
     //How many frames were in last FPS update 
     int frameCounter = 0; 

     //Main thread loop 
        //Main thread loop 
     while (true) { //Some exit check code should be here 
      synchronize (gameState) { 
       //Draw the state on the canvas 
       drawStateOnCanvas(); 
      } 

      //Increment frame counter 
      frameCounter++; 

      int delay = (int)(System.getCurrentTimeMillis() - lastFpsTime); 
      //If last FPS was calculated more than 1 second ago 
      if (delay > 1000) { 
       //Calculate FPS 
       double FPS = (((double)frameCounter)/delay)*1000; //delay is in milliseconds, that's why *1000 
       frameCounter = 0; //Reset frame counter 
       lastFpsTime = System.getCurrentTimeMillis(); //Reset fps timer 

       log.debug("FPS: "+FPS); 
      } 
     } 
    } 
} 
+1

Проблема в том, что я НЕ ДОЛЖЕН иметь доступ к исходному коду. Я только что скомпилировал приложения в apk, и доступ к исходному коду был бы таким же простым, как вы описали. – ajoz

+0

О, дерьмо. Не заметил эту часть в вашем сообщении. Понедельник после Рождества в конце концов :) – bezmax

0

This is a good read на игровом цикле. Он объясняет различные реализации и плюсы/минусы игровых циклов.

И this is a good tutorial по внедрению счетчика gameloop + FPS в Android.

+1

Статья в игровой цикл хороша, но действительно устарела. Внесение update() и render() в один поток плохо, особенно при создании и управлении потоками так же просто, как и на современных языках. – bezmax

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