Java 每x毫秒更新一个对象
我有个问题。要制作视频游戏,我必须实现一个名为update()的函数 参数lastCallTime是我们最后一次调用update 它必须做到以下几点:Java 每x毫秒更新一个对象,java,Java,我有个问题。要制作视频游戏,我必须实现一个名为update()的函数 参数lastCallTime是我们最后一次调用update 它必须做到以下几点: 计算自上次调用更新以来经过的时间 如果经过的时间比ifUpdate=true多20[ms] 并重置每个对象的上次更新时间 线程将以以下方式调用此方法: @Override public void run(){ long lastCallTime; int k = 0; lastCallTime = System.curr
@Override
public void run(){
long lastCallTime;
int k = 0;
lastCallTime = System.currentTimeMillis();
while(true){
//Do something
boolean ifUpdate = update(lastCallTime);
}
}
不久前,我写了一些类似的东西。 update方法将以FPS速率调用(示例中为24)。因此,需要计算更新方法所消耗的时间(变量
timeDiff
)。还将检查进程睡眠时间是否大于或小于所指示的时间(变量overSleepTime
),此时间将在下一个周期中被加/减
我希望它能帮助你
long timeDiff, sleepTime;
long afterTime, beforeTime;
long overSleepTime = 0L;
int fps = 24; // the desire FPS
long period = 1000000000L / fps;
while(true) {
beforeTime = System.nanoTime();
// your game logic
update();
afterTime = System.nanoTime();
// timeDiff is time needed by the update process
timeDiff = afterTime - beforeTime;
sleepTime = (period - timeDiff) - overSleepTime;
if(sleepTime > 0) {
try {
Thread.sleep(sleepTime / 1000000L); // sleeptTime is in nano secs and sleep expects millis
} catch(InterruptedException e) {}
// checks if the thread has slept more than desired
overSleepTime = (System.nanoTime() - afterTime) - sleepTime;
} else {
// negative sleeptTime means that the system can't be update at the desired rate
overSleepTime = 0L;
}
}
}
lastUpdated=System.currentTimeMillis()
instrad of=0
@darijan:事实上,我想你应该希望lastUpdated=currentTime
。你应该看看观察者的模式我不明白为什么lastUpdated=0;因为你想让它在最后一次更新1)这是秋千吗?2) 为了更快地获得更好的帮助,请发布一个。3) 不要阻止EDT(事件调度线程)-发生这种情况时,GUI将“冻结”。不要调用Thread.sleep(n)
为重复任务执行Swing计时器,或为长时间运行的任务执行SwingWorker
。有关更多详细信息,请参阅。4) 你的问题是什么?
long timeDiff, sleepTime;
long afterTime, beforeTime;
long overSleepTime = 0L;
int fps = 24; // the desire FPS
long period = 1000000000L / fps;
while(true) {
beforeTime = System.nanoTime();
// your game logic
update();
afterTime = System.nanoTime();
// timeDiff is time needed by the update process
timeDiff = afterTime - beforeTime;
sleepTime = (period - timeDiff) - overSleepTime;
if(sleepTime > 0) {
try {
Thread.sleep(sleepTime / 1000000L); // sleeptTime is in nano secs and sleep expects millis
} catch(InterruptedException e) {}
// checks if the thread has slept more than desired
overSleepTime = (System.nanoTime() - afterTime) - sleepTime;
} else {
// negative sleeptTime means that the system can't be update at the desired rate
overSleepTime = 0L;
}
}