我正在用 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
限制在某个上限。
最佳答案
您是否考虑过使用计时器之类的东西而不是循环旋转?
TimerTask tt = new TimerTask(){
long prev = System.currentTimeMillis();
public void run(){
long now = System.currentTimeMillis();
for (Mass m : masses) {
m.updatePosition(now-prev);
}
prev = now;
}
}
new Timer(true).schedule(tt, 1000, 1000) ;
这样你就可以保证至少在你的对象更新之间有一些延迟,所以你不应该像 while(true) 循环那样连续重绘一堆,如果线程被延迟你就不会得到立即重新执行任务,来自文档:“在固定延迟执行中,每次执行都是相对于前一次执行的实际执行时间安排的。”
关于java - 测量在应用程序/线程中花费的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2637122/