2017-11-28 3 views
1

나는 안드로이드에서 거의 첫 게임을 끝냈습니다. 나는 혼자서는 이해할 수없는 문제가있다. 내가 만든 게임 엔진의 그리기 메서드를 업데이트하고 호출하는 기본 게임 루프 스레드를 사용합니다. 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); 
    } 
} 

: 그러나, 나는 그것이 너무 오래하지 않아야 만 몇 비트 맵을 그릴 ... 여기 내 그리기 방법

가난한 영어
@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) {} 
    } 
} 

죄송이 처음 라되지 않습니다 :

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); 
     } 
    } 
} 

그리고 여기에 기본적으로 내가 인터넷에서 발견 다른 사람과 같은 내 게임 루프입니다 nguage.

+0

http://idownvotedbecau.se/nomcve/ –

+0

고맙습니다. 제 질문을 편집하고 코드 샘플을 추가했습니다. 중요한 부분을 선택하고 MCVE가있는 것은 꽤 복잡하지만 충분히 좋기를 바랍니다. – Mmarie

답변

0

죄송합니다. 죄송합니다. 각 라인이 얼마나 많은 시간이 걸렸는지 측정하여 문제를 발견했습니다. 스레드를 닫을 수 있습니다. 누군가가이 스레드를보고 답을 알고 싶다면

, 내 문제는이 줄을이었다

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

bmp_background 및 background_rect이 같은 크기를 가지고 있지 않기 때문에 우리가 그리기라는 때마다 스케일링 비트 맵을 있었다(). Bitmap.createScaledBitmap (...)을 호출하여 너비 또는 높이가 변경 될 때 크기가 조정 된 비트 맵을 만든 다음 크기 조정 된 비트 맵을 그립니다.