2017-11-28 17 views
1

私はAndroidで最初のゲームをほぼ終了しました。私は自分で理解できない問題があります。私は作成したゲームエンジンの描画メソッドを更新して呼び出す基本的なゲームループスレッドを使用します。私はFPSが非常に低いことに気が付いたので、レンダリング時間を測定したところ、描画に50msかかることがわかりました(私は約20FPSで目には不快です)。ゲームのレンダリングが非常に遅い

:異なる描画方法は、例えば、drawCops()のために、非常に単純です

public void Draw(Canvas canvas){ 
    width = canvas.getWidth(); 
    height = canvas.getHeight(); 
    character_rect.set(character.x, (int)(height*80.0/100), character.x+bmp_character.getWidth(), (int)(height*80.0/100)+bmp_character.getHeight()); 
    background_rect.set(0, 0, width, height); 

    canvas.drawBitmap(bmp_background, null, background_rect, _paint); 
    drawCops(canvas); 
    drawGangsters(canvas); 
    drawTrees(canvas); 
    drawButtons(canvas); 
    drawCharacter(canvas); 
    _paint.setTextSize(45); 
    _paint.setColor(Color.WHITE); 
    canvas.drawText("Score: "+score, (float)(width*3.0/100), (float)(height*3.0/100), _paint); 
    canvas.drawText("Money: "+money, (float)(width*3.0/100), (float)(height*6.0/100), _paint); 
    _paint.setColor(Color.RED); 
    canvas.drawRect((float)(width*3.0/100),(float)(height*8.0/100), (float)(width*3.0/100 + (current_hp*width*1.0/100)), (float)(height*10.0/100), _paint); 
    if(game_over){ 
     gameover_rect = new Rect(0, 0, width, height); 
     canvas.drawBitmap(gameover_background, null, gameover_rect, _paint); 
     _paint.setColor(Color.WHITE); 
     _paint.setTextSize(60); 
     canvas.drawText("GAME OVER!", (int)(width*20.0/100), (int)(height*45.0/100), _paint); 
     canvas.drawText("Score: "+score, (int)(width*20.0/100), (int)(height*50.0/100), _paint); 
     canvas.drawText("Best score: "+character.bestScore, (int)(width*20.0/100), (int)(height*55.0/100), _paint); 
     canvas.drawText("Money earned: "+money+" $", (int)(width*20.0/100), (int)(height*60.0/100), _paint); 
     canvas.drawBitmap(replay_button_image, null, replay_button_rect, _paint); 
    } 
} 

: はしかし、私はそれはそう長くすべきではない、ほんの数ビットマップを描く... は、ここに私のdrawメソッドであります

public void drawCops(Canvas canvas) { 
    for(int i=0; i<cops.length; i++) { 
     if(cops[i].active) { 
      canvas.drawBitmap(cops[i].image, null, cops[i].box, _paint); 
     } 
    } 
} 

そして、ここでは基本的に私がネットで見つけ他人と同じである私のゲームループは、次のとおりです。下手な英語のための

@Override 
public void run() { 
    long FPS = 40; 
    long ticksPS = (long) (1000.0/FPS); 
    long startTime; 
    long sleepTime; 
    while (_isOnRun) { 
     Canvas c = null; 
     startTime = System.currentTimeMillis(); 
     engine.Update(); 
     try { 
      c = _surfaceHolder.lockCanvas(); 
      synchronized (_surfaceHolder) { 
       engine.Draw(c); 
      } 
     } finally { 
      if (c != null) { 
       _surfaceHolder.unlockCanvasAndPost(c); 
      } 
     } 
     sleepTime = ticksPS-(System.currentTimeMillis() - startTime); 
     Log.e("tag", "render time: " + (ticksPS-sleepTime)); 
     try { 
      if (sleepTime > 0) { 
       sleep(sleepTime); 
      } 
      else{ 
       sleep(4); 
      } 
     } catch (Exception e) {} 
    } 
} 

申し訳ありませんが、これが私の最初のラではありませんnguage。

+0

http://idownvotedbecau.se/nomcve/ –

+0

ありがとう、私は私の質問を編集し、私のコードのいくつかのサンプルを追加しました。重要な部分を選択してMCVEを持っているのはかなり複雑ですが、それが十分であることを願っています。 – Mmarie

答えて

0

申し訳ありませんが、私は最終的に各行がどれくらいの時間を取ったかを測定することで問題を発見しました。スレッドを閉じることができます。

誰かがこのスレッドを見て答えを知りたい場合は、私の問題は、この行だった:

canvas.drawBitmap(bmp_background, null, background_rect, _paint); 

bmp_backgroundとbackground_rectは、同じサイズを持っていないので、我々はドローと呼ばれるたびにスケーリングビットマップがありましたが()。 これを解決するには、Bitmap.createScaledBitmap(...)を呼び出して、幅または高さが変更されたときにスケーリングされたビットマップを作成し、次にスケーリングされたビットマップを描画します。

関連する問題