2016-10-12 2 views
2

Так что im делает игру в java, и у меня есть проблема. Таймер использует много ресурсов процессора (около 30%), и это, вероятно, не должно. Когда я пытаюсь поместить рендер в таймер, все работает нормально. А иногда, ничего не меняя он работает отличноjava таймер игры, используя массу ресурсов

public static synchronized void run(){ 
    long last = System.nanoTime(); 
    double npt = Time.nano/tps; //one second/ticks 
    double delta = 0; 
    //long now; 

    long pfmLast = System.currentTimeMillis(); 
    long pfmSpm = Time.nano * spu; 
    long pfmDelta = 0; 
    int pfmUpdates = 0; 
    long pfmNow; 

    long fpsLast = System.nanoTime(); 
    double npf = Time.nano/fps; //one second/ticks 
    double fpsDelta = 0; 
    //long fpsNow; 

    int frames = 0; 

    Handler.init(); 


    try { 
     en = new Entity(ImageIO.read(new File("res/robot.png")), 1, 1, false); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

    while(running){ 
     long now = System.nanoTime(); 
     delta += (now - last)/npt; 
     last = now; 

     while(delta >= 1){ 
      pfmUpdates++; 
      Handler.update(); 

      delta -= 1; 
     } 

     long fpsNow = System.nanoTime(); 
     fpsDelta += (fpsNow - fpsLast)/npf; 
     fpsLast = fpsNow; 



     while(fpsDelta >= 1){ 
      frames++; 
      render(); 
      Handler.render(); 

      fpsDelta -= 1; 
     } 



     if(loggingPerformance){ 
      pfmNow = System.currentTimeMillis(); 
      pfmDelta += pfmNow-pfmLast; 
      pfmLast = pfmNow; 

      if(pfmDelta >= 1000){ 
       System.out.println(pfmUpdates + ", " + frames); 
       frames = 0; 
       pfmUpdates = 0; 
       pfmDelta=0; 
      } 

     } 




     try { 
      Thread.sleep(2); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     /*fpsNow = System.currentTimeMillis(); 
     fpsDelta += fpsNow - fpsLast; 
     fpsLast = fpsNow; 

     if(fpsDelta >= npf){ 
      //Handler.render(); 

      frames++; 
      fpsDelta -= npf; 
     }*/ 


    } 
} 
+2

Какая игра? Какая библиотека графического интерфейса? Меня зовут петли, поскольку они будут записывать циклы процессора. –

+1

Вы пробовали профилировать свое приложение? –

+0

@HovercraftFullOfEels не использует каких-либо либералов, и на данный момент его единственные объекты рисования на изображении, которое тянется к холсту –

ответ

0

Я думаю, что проблема в том, что у вас есть несколько в то время как петли, которые в основном вычислительное состояние вашей игры для каждого наносекунды в delta.

Это наносит огромный урон вашему компьютеру.

Вместо этого вы должны сделать любой расчет, который вы делаете в Handler.render(), функцию delta, поэтому вам нужно только вычислить ее один раз вместо 1.000.000.000 раз за каждую секунду!

Так что я имею в виду, что это

while(delta >= 1){ 
     pfmUpdates++; 
     Handler.update(); 

     delta -= 1; 
    } 

должен стать чем-то вроде этого:

Handler.update(delta)