2010-04-14 78 views
4

我正在用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

+3

旋盖三角洲似乎是一个很好的解决方案给我。 – 2010-04-14 12:05:01

回答

6

你有没有考虑过使用类似计时器的东西而不是在循环中旋转?

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) ; 

你保证至少有你的对象的更新之间存在一些延迟,所以你不应该有一堆重绘作为连续用,而(真)循环,如果线程被延迟,这样您将不会立即重新执行该任务,从文档中获得:“在固定延迟执行中,每个执行都按照前一次执行的实际执行时间进行计划。”

3

我发现javax.swing.Timer.html对此特别有帮助。这里有一个example模拟球形颗粒和容器壁之间的弹性碰撞。

附录:此相关的approach可能有助于从视图中分离模型。一个单独的线程模拟系统的演变,而视图以固定的速率渲染模型的“快照”。

在任何一种情况下,我都会限制速率以适应最慢的目标平台。

+0

谢谢 - 我已经在使用Timer,但想离开它,因为我担心给定的机器无法跟上指定的帧速率;即我希望机器确定帧频而不是强制它。 – Adamski 2010-04-14 16:27:08

+0

我明白了,尽管我倾向于根据最慢目标平台的“渲染预算”来思考过于狭隘。我添加了一个可能提供一些见解的相关示例。 @Jim Blackler的建议可能是最好的。 – trashgod 2010-04-14 18:19:28

+0

U shld参见Adamski的热点图形。Theyd blow your mind – 2010-07-15 23:59:32

1

您可能会喜欢本文的标题为“Java:使用ThreadMXBean获得线程时间”的article

基本上,有一类ThreadMXBean,使您可以花费在特定Thread花费的时间。我还没有尝试过,但方法(和我提到的文章中的例子)看起来很有前途,所以我认为你可以用这个完成你想要的。

+0

谢谢 - 我会检查出来。 – Adamski 2010-04-15 11:39:51

相关问题