如何使渲染循环以一致的速率运行?

时间:2012-07-20 17:02:14

标签: java rendering frame-rate

我编写了一个基于用户输入移动动画精灵的程序,这些精灵全部发生在while(true)循环中。到目前为止,我对循环计时的唯一方法是在每次循环结束时使用sleep(20)。我已经注意到这对我精灵的物理效果产生了负面影响,因为我计算重力的公式是velocity = velocity + GRAVITY * Elapsed-Time,并且因为循环没有以一致的速率运行,重力的影响也不一致。 有没有办法让循环保持一致或更好的计时方式,以便实际按计划运行?

2 个答案:

答案 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

无论您的帧速率是否恒定,这都应该有效。诀窍是精确测量经过的时间。一致。测量从循环中某点到下一循环中相同点的经过时间。