2017-09-28 4 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()'무엇인가'tick()'및'delta -;'대신'Thread.sleep (delta/1000); – matt

+0

tick()이 내 업데이트 호출입니다. 나는 그것이 약 90 %를 어떤 이유로 사용하기 때문에 나의 cpu를 제한 할 필요가있다. 루프를 여러 번 호출 할 수 있기 때문에 나는 그것을 생각합니다. 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

감사합니다. 그래서 나는이 코드로 대체 할 델타 루프를 제외한 모든 것을 유지해야합니까? –

관련 문제