2010-12-27 4 views
1

ゲームアプリケーションでFrames Per Secondを計算する方法を探していますが、問題はそれらのアプリケーションのソースコードを持っていないということです。正直言って、私はこれが可能であると本当に期待していませんが、尋ねる価値がありました。Androidゲームで1秒あたりのフレーム数を計算する

そして、私は、FPSを数えるためには、メインペインティングループの基本的な知識とコードが必要だと私は理解しています。

よろしく

答えて

0

私はレンダリングを制御し、編集JREクラスとjarファイルをxbootうAndroidのゲーム開発とあまりにも精通してないんだけど、2Dで中(...それは少しハックだが、それは動作します) (例えば、Canvas)をプロセスに挿入します。

1

メインペイントループがあるときにFPSをカウントするのはどうですか?

私はAndroidの機能に精通していませんが、どのOSのどのゲームでも同じように行われています。ゲームを作る最も簡単な方法は、2つのスレッドを作ることです。最初はロジックアクション(軌道の計算、時間の経過に伴うオブジェクトの位置の変化など)です。 2番目のスレッドは、現在のゲーム状態(最初のスレッドによって計算された)をとり、それを画面に描画します。ゲームループ上

//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

問題は、私はDONTにソースコードへのアクセス権があります。私はapkのアプリケーションをコンパイルしただけで、ソースコードへのアクセスは説明どおりに簡単です。 – ajoz

+0

ああ。あなたのメッセージにその部分を気付かなかった。結局クリスマス後の月曜日:) – bezmax

0

This is a good read:ここ

はFPSカウンターとの両方のスレッドでコメントしたコードです。ゲームループのさまざまな実装と長所/短所について説明します。

そしてthis is a good tutorialはAndroidでgameloop + FPSカウンタを実装しています。

+1

ゲームループの記事は素晴らしいですが、実際には時代遅れです。あるスレッドにupdate()とrender()を入れるのは悪いです。特に、スレッドの作成と管理が現代の言語ほど簡単です。 – bezmax

関連する問題