0
정확한 타이머가있는 게임 루프를 만들려고합니다. TimeUnit
은 thread.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을 보았다. 추가 할 수도 있습니다
다른 루프와 비교하면 어떻습니까?
편집 :이 게임의 경우
표준 자바, 외부 (즉, 네이티브 라이브러리)의 도움없이 마이크로 수준의 실시간 정밀 작동 만약에 이제까지하지 않을 : 그것은 아마 대신 타이머를 사용하는 것이 더 나을 있지만, 합리적인 접근 방식 . –
@ 짐 수비대 그렇다면 어떤 제안이 있습니까? – cat16
임베디드, 데스크탑, 파이 등 환경에 따라 달라집니다. 마이크로 초 정밀도가 필요한 경우 C와 같은 명령어 (예 : 해석되지 않은 바이트 코드)로 컴파일되는 하드웨어에 가까운 곳에서 작성해야합니다. –