2017-09-28 150 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

好的,谢谢。所以我应该保留一切,但三角洲循环,我会用这个代码替换? –