我正在尝试制作一个具有准确计时器的游戏循环。我知道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了。我不妨添加
这与其他循环相比如何?
编辑:这适用于桌面游戏,而非移动
答案 0 :(得分:0)
在游戏的情况下,我怀疑你真的想要纳秒级的精确度。你想要的是避免累积错误,这是你的代码试图做的事情。这是一种合理的方法,尽管使用Timer可能更有意义:
Timer timer = new Timer()
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// Your periodic code here
}
}, 0, 1);