0

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

4

2 回答 2

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();
}
于 2012-07-20T17:06:19.157 回答
0
velocity = velocity + GRAVITY * Elapsed-Time

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

于 2012-07-20T17:15:22.460 回答