java - 测量在应用程序/线程中花费的时间

标签 java java-2d

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

相关文章:

java - 旋转图像滋扰

java - Spring Boot mvc 异步执行

Java:Jersey Rest 服务 URL 映射问题

java - 如何使用颜色图案剪切图像?

java - 调整大小和最小化窗口时对象消失

java - 在同一个 JLabel 上绘制多个图形

java - 日历周日至周日

java - 在 jpa 绑定(bind) native 查询中使用 switchyard 属性

java - 如何在 AlertDialog 中访问文本的 android 中的字符串资源

java - 如何在JFrame上用java绘制1024交叉1024网格单元?