使thread.sleep准确

时间:2016-12-06 23:09:49

标签: java game-loop

我正在尝试制作一个具有准确计时器的游戏循环。我知道TimeUnit使用的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 :(得分:0)

在游戏的情况下,我怀疑你真的想要纳秒级的精确度。你想要的是避免累积错误,这是你的代码试图做的事情。这是一种合理的方法,尽管使用Timer可能更有意义:

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