我正在使用Java编写一个模拟程序,其中物体按照牛顿物理学的规律运动。可以对物体施加力,并且由此产生的速度使其在屏幕上移动。由于模拟的性质,物体移动是根据当前和上一次动画循环之间经过的时间间隔来离散进行的;例如:
public void animationLoop() {
long prev = System.currentTimeMillis();
long now;
while(true) {
long now = System.currentTimeMillis();
long deltaMillis = now - prev;
prev = now;
if (deltaMillis > 0) { // Some time has passed
for (Mass m : masses) {
m.updatePosition(deltaMillis);
}
// Do all repaints.
}
}
}
如果动画线程被延迟,导致大量的时间流逝(经典案例是在Windows下点击并保持最小化/最大化会阻止重新绘制),则会导致对象移动的速度惊人。我的问题是:是否有一种方法可以确定所花费的时间是动画线程而不是壁钟时间,或者有没有人能够建议一个解决方法来避免这个问题?
我唯一的想法是通过某些上限限制 deltaMillis
。