2016-12-06 5 views
0

정확한 타이머가있는 게임 루프를 만들려고합니다. TimeUnitthread.sleep();을 사용하며 밀리 초 단위로 달라질 수 있습니다. 제 질문은 간단합니다 :thread.sleep을 정확하게 만들기

이 코드로 thread.sleep();을보다 정확합니까?

추가

내가 해결하기 위해 할 수있는 일이/더 나은을 만들거나 내가 포기해야 있습니까?

import java.util.concurrent.TimeUnit; 

public class Timer implements Runnable { 

public static void main(String[]args){ 
    new Timer().start(); 
} 

public int ups = 1; 

@Override 
public void run() { 
    int uc = 0; 
    long startTime = 0; 
    long result = 0; 
    long offset = 0; 
    while(true){ 
     startTime = System.nanoTime(); 
     uc++; 
     if(uc==1000/ups){ 
      update(); 
      uc=0; 
     } 
     result = System.nanoTime()-startTime; 
     if(1000000-result>0) 
      try { 
       int prefered = 1000000; 
       startTime = System.nanoTime(); 
       TimeUnit.NANOSECONDS.sleep(prefered-result-offset); 
       offset = System.nanoTime()-startTime-prefered+result+offset; 
      } catch (InterruptedException e) { 
       System.out.println("an error has occured"); 
      } 
    } 
} 

public void update(){ 
    System.out.println("Hello World"); 
} 

public void start(){ 
    new Thread(this).start(); 
} 
} 

난 이미 방법으로 this을 보았다. 추가 할 수도 있습니다

다른 루프와 비교하면 어떻습니까?

편집 :이 게임의 경우

+1

표준 자바, 외부 (즉, 네이티브 라이브러리)의 도움없이 마이크로 수준의 실시간 정밀 작동 만약에 이제까지하지 않을 : 그것은 아마 대신 타이머를 사용하는 것이 더 나을 있지만, 합리적인 접근 방식 . –

+0

@ 짐 수비대 그렇다면 어떤 제안이 있습니까? – cat16

+0

임베디드, 데스크탑, 파이 등 환경에 따라 달라집니다. 마이크로 초 정밀도가 필요한 경우 C와 같은 명령어 (예 : 해석되지 않은 바이트 코드)로 컴파일되는 하드웨어에 가까운 곳에서 작성해야합니다. –

답변

0

, 모바일이 아닌 데스크탑 게임이다, 나는 의심 당신은 정말 깨어있는 나노초 정밀도를 원한다. 당신이 원하는 것은 누적되는 에러를 피하는 것입니다. 이것은 여러분의 코드가하려고하는 것입니다.

Timer timer = new Timer() 
timer.scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
    // Your periodic code here 
    } 
}, 0, 1);