2011-12-11 6 views
0

私はちょうどゲームを作るためにアンドロイドの開発をピックアップしています。これまでに触れたが、基本を取り上げただけだった。私は少しメインループを設定する方法が混乱しています。私はXNA(C#)に入っていて、私は分離された更新/描画ループが大好きです。Androidのgameloop、更新と描画が別々かどうか?

私は典型的なアンドロイドのガミュロップがどのように機能するのだろうかと思っていましたか?私はオンラインで検索し、2つの方法に出くわしました:

public void run() { 

     while (running) { 

       //Method 1: update is called here 
       view.update(); 
       Canvas c = null; 

       try { 

         c = view.getHolder().lockCanvas(); 

         synchronized (view.getHolder()) { 

          //Method 2: update is called inside view.onDraw 
           view.onDraw(c); 

         } 

       } finally { 

         if (c != null) { 

           view.getHolder().unlockCanvasAndPost(c); 
         } 
       } 
     } 
    } 

はのは、2つの方法のための一例として、ゲームエンティティの更新を見てみましょう:

 //METHOD1 

public void onDraw(Canvas canvas) 
{ 
    for (GameEntity entity : entities) 
    { 
     entity.update(); 
     entity.draw(canvas); 
    } 
} 

//END METHOD 1 

//METHOD 2 

public void update() 
{ 
    for (GameEntity entity : entities) 
    { 
     entity.update(); 
    } 
} 

public void draw(Canvas canvas) 
{ 
    for (GameEntity entity : entities) 
    { 
     entity.draw(canvas); 
    } 
} 

//END METHOD 2 

今、私はスレッドと経験がありませんなので、XNAのスクリーンの背後にあるXNAがどのように更新/描画ループを行うのか分かりません。 しかし、方法1を使用すると、更新のために1回、別々の描画のために1回、すべてのエンティティを2回ループする必要があります。私はこれがパフォーマンスを殺すのではないかと恐れていますが、私はこのサンプルをオンラインで見ています。

私は何か不足していますか、私は正しいですか?方法2は最高のパフォーマンスを賢明ですか?

答えて

0

ループ回数は重要ではありません。重要なのは、実行するアクションの数だけです。そして、実行されるアクションの量は基本的に同じです。 2番目の「for」は1つの「if」を1つ追加します。それほど多くはありません。

しかし、あなたはどちらかのアクションだけを実行することができ、両方を強制することはできません。 例:ゲームを60回/秒で更新したいが、40fpsしか描画しない場合は、方法2でしか行うことができません。これは、より少ない計算量でより流動的なゲームを可能にしますが、 。

ダーウィと更新が同じレートで発生した場合、それらを分割するのは馬鹿です

関連する問題