2017-09-28 147 views
0

如何使用此代碼爲我的Java遊戲限制CPU使用率?我想一種方法可能是使用Thread.sleep(),但只有當我可以計算時間或類似的東西。有人可以幫幫我嗎?如何限制CPU使用率?

public void run(){ 
    this.requestFocus(); 
    long lastTime = System.nanoTime(); 
    double amountOfTicks = 60.0; 
    double ns = 1000000000/amountOfTicks; 
    double delta = 0; 
    long timer = System.currentTimeMillis(); 
    int frames = 0; 
    while(isRunning){ 
     long now = System.nanoTime(); 
     delta += (now - lastTime)/ns; 
     lastTime = now; 
     while(delta >= 1){ 
      tick(); 
      delta--; 
     } 
     render(); 
     frames++; 

     if(System.currentTimeMillis() - timer > 1000){ 
      timer += 1000; 
      frames = 0; 
     } 
    } 
    stop();  
} 
+1

請問您可以指出,爲什麼您想限制遊戲循環的CPU時間?也許你應該考慮一下你的設計。 –

+0

什麼是'tick()'爲什麼不做'Thread.sleep(delta/1000);'而不是'tick()'和'delta - ;''? – matt

+0

tick()是我的更新調用。我需要限制我的CPU,因爲它由於某種原因使用了大約90%。我認爲它是因爲我儘可能多地呼叫循環。 Thread.sleep會工作嗎?如果是這樣,多久? –

回答

0

除了缺少的部分,這看起來很直觀。考慮你想以某種固定的速度更新。

while(isRunning){ 


    tick(); 
    render(); 
    long now = System.nanoTime(); 
    double delta = now - lastTime; 
    double remaining = delta - ns; 
    if(remaining>1000){ 
     try{ 
      Thread.sleep((int)(remaining/1000)); 
     } catch(InterruptedException e){ 
      throw new RuntimeException(e); 
     } 
    } 

    frames++; 
    lastTime = System.nanoTime(); 
    if(System.currentTimeMillis() - timer > 1000){ 
     timer += 1000; 
     frames = 0; 
    } 
} 
+0

所以我應該把所有這一切都放在:(運行時){} –

+0

它應該幾乎取代你的while(delta> = 1)'循環。我可以用完整的'while(isRunning)'循環來更新它。 – matt

+0

好的,謝謝。所以我應該保留一切,但三角洲循環,我會用這個代碼替換? –