2014-02-10 1 views
0

Хорошо, так почему мои кадры в секунду падают в случайное время во время игры? и что я могу сделать, чтобы исправить это. Ниже я собираюсь показать код, который у меня есть с движком, который был построен.Как остановить кадры в секунду от падения?

 public Engine() { 
    Log.d("Engine","Engine constructor"); 
    p_view = null; 
    p_canvas = null; 
    p_thread = null; 
    p_running = false; 
    p_paused = false; 
    p_resume = false; 
    p_paintDraw = null; 
    p_paintFont = null; 
    p_numPoints = 0; 
    p_typeface = null; 
    p_preferredFrameRate = 40; 
    p_sleepTime = 1000/p_preferredFrameRate; 
    p_pauseCount = 0; 
    p_group = new LinkedList<Sprite>(); 
} 

    /** 
* Runnable.run thread method (MAIN LOOP) 
*/ 
@Override 
public void run() { 
    Log.d("Engine","Engine.run start"); 

    ListIterator<Sprite> iter=null, iterA=null, iterB=null;  

    Timer frameTimer = new Timer(); 
    int frameCount=0; 
    int frameRate=0; 
    long startTime=0; 
    long timeDiff=0; 

    while (p_running) { 
     // Process frame only if not paused 
     if (p_paused) continue; 

     // Calculate frame rate 
     frameCount++; 
     startTime = frameTimer.getElapsed(); 
     if (frameTimer.stopwatch(1000)) { 
      frameRate = frameCount; 
      frameCount = 0; 

      //reset touch input count 
      p_numPoints = 0; 
     } 


     // Call abstract update method in sub-class 
     update(); 


     /** 
     * Test for collisions in the sprite group. 
     * Note that this takes place outside of rendering. 
     */ 
     iterA = p_group.listIterator(); 
     while (iterA.hasNext()) { 
      Sprite sprA = (Sprite)iterA.next(); 
      if (!sprA.getAlive()) continue; 
      if (!sprA.getCollidable()) continue; 

      /* 
      * Improvement to prevent double collision testing 
      */ 
      if (sprA.getCollided()) 
       continue; //skip to next iterator 

      //iterate the list again 
      iterB = p_group.listIterator(); 
      while (iterB.hasNext()) { 
       Sprite sprB = (Sprite)iterB.next(); 
       if (!sprB.getAlive()) continue; 
       if (!sprB.getCollidable()) continue; 

       /* 
       * Improvement to prevent double collision testing 
       */ 
       if (sprB.getCollided()) 
        continue; //skip to next iterator 

       //do not collide with itself 
       if (sprA == sprB) continue; 

       /* 
       * Ignore sprites with the same ID? This is an important 
       * consideration. Decide if your game requires it or not. 
       */ 
       if (sprA.getIdentifier() == sprB.getIdentifier()) 
        continue; 

       if (collisionCheck(sprA, sprB)) { 
        sprA.setCollided(true); 
        sprA.setOffender(sprB); 
        sprB.setCollided(true); 
        sprB.setOffender(sprA); 
        break; //exit while 
       } 
      } 
     } 


     // begin drawing 
     if (beginDrawing()) { 

      // Call abstract draw method in sub-class 
      draw(); 


      /** 
      * Draw the group entities with transforms 
      */ 
      iter = p_group.listIterator(); 
      while (iter.hasNext()) { 
       Sprite spr = (Sprite)iter.next(); 
       if (spr.getAlive()) { 
        spr.animate(); 
        spr.draw(); 
       } 
      } 

      /** 
      * Print some engine debug info. 
      */ 
      int x = p_canvas.getWidth()-150; 
      p_canvas.drawText("ENGINE", x, 20, p_paintFont); 
      p_canvas.drawText(toString(frameRate) + " FPS", x, 40, 
       p_paintFont); 
      p_canvas.drawText("Pauses: " + toString(p_pauseCount), 
       x, 60, p_paintFont); 

      // done drawing 
      endDrawing(); 
     } 

     /* 
     * Do some cleanup: collision notification, removing 
     * 'dead' sprites from the list. 
     */ 
     iter = p_group.listIterator(); 
     Sprite spr = null; 
     while (iter.hasNext()) { 
      spr = (Sprite)iter.next(); 

      //remove from list if flagged 
      if (!spr.getAlive()) { 
       iter.remove(); 
       continue; 
      } 

      //is collision enabled for this sprite? 
      if (spr.getCollidable()) { 

       //has this sprite collided with anything? 
       if (spr.getCollided()) { 

        //is the target a valid object? 
        if (spr.getOffender() != null) { 

         /* 
         * External func call: notify game of collision 
         * (with validated offender) 
         */ 
         collision(spr); 

         //reset offender 
         spr.setOffender(null); 
        } 

        //reset collided state 
        spr.setCollided(false); 

       } 
      } 
     } 

     // Calculate frame update time and sleep if necessary 
     timeDiff = frameTimer.getElapsed() - startTime; 
     long updatePeriod = p_sleepTime - timeDiff; 
     if (updatePeriod > 0) { 
      try { 
       Thread.sleep(updatePeriod); // i notice this is called when frames are low 
      } 
      catch(InterruptedException e) {} 
     } 

    }//while 
    Log.d("Engine","Engine.run end"); 
    System.exit(RESULT_OK); 
}  


    public void setFrameRate(int rate) { 
    p_preferredFrameRate = rate; 
    p_sleepTime = 1000/p_preferredFrameRate; 
} 

Так что это не весь двигатель, но это все, что имеет дело с кадрами Почему случайно снижается? Что я замечаю, что thread.sleep вызывается, когда кадры опускаются ниже 15. Я использую nexus 5 для проверки этого на Android 4.4.2, и мой вопрос здесь. Как я могу остановить кадры из этого низкого и если он спит, особенно после вызова воссоздания(); когда вы теряете игру?

ответ

2

Просто выньте описание Thread.Sleep. Или просто передайте «0» в вызов сна (если вы пытаетесь дать циклы другим потокам и процессам). В каждом цикле цикла run() вычислите, сколько времени прошло фактически, и обновите симуляцию на основе этого значения. Другими словами, не пытайтесь заставить жестко кодированную частоту кадров.

Устройство имеет верхнюю частоту кадров (60 кадров в секунду на моем устройстве). Таким образом, вы, вероятно, будете спать немного во время каждого цикла в любом случае.

+0

Так что удаление инструкции tread.sleep остановит кадры от падения? –

+1

Попробуйте и посмотрите ... если это не так, вы должны применить инструмент для профилирования к вашему коду. – selbie

+0

Итак, я действительно вынул метод сна, и он все еще падает. Сейчас происходит то, что он замерзает, когда загружается слишком много изображений. –