我编写了一个基于用户输入移动动画精灵的程序,这些精灵全部发生在while(true)
循环中。到目前为止,我对循环计时的唯一方法是在每次循环结束时使用sleep(20)
。我已经注意到这对我精灵的物理效果产生了负面影响,因为我计算重力的公式是velocity = velocity + GRAVITY * Elapsed-Time
,并且因为循环没有以一致的速率运行,重力的影响也不一致。 有没有办法让循环保持一致或更好的计时方式,以便实际按计划运行?
答案 0 :(得分:2)
首先,确定您希望帧的持续时间。如果你想要30 fps,那么你将拥有
final long frameDuration = 1000 / 30;
接下来,当你开始渲染时,存储时间,如此
final long then = System.currentTimeMillis();
render(); // surely it's more than this but you get the idea
final long now = System.currentTimeMillis();
final long actualDuration = now - then;
final long sleepDuration = frameDuration - actualDuration;
if(sleepDuration > 0) {
sleep(sleepDuration);
} else {
throw new FrameTooLongException();
}
答案 1 :(得分:0)
velocity = velocity + GRAVITY * Elapsed-Time
无论您的帧速率是否恒定,这都应该有效。诀窍是精确测量经过的时间。一致。测量从循环中某点到下一循环中相同点的经过时间。