Java 计时器 Swing 精确到 60 fps

标签 java swing timer frame-rate

我在 JPanel 中有一个动画,它通过 javax.swing.Timer 更新自身。可以构造此计时器以具有必须为整数的毫秒延迟。如果我让 JPanel 每秒更新 60 次,我会将延迟设置为 1000/60 = ~16.6666。但是,这个延迟必须是一个整数,所以我可以选择向上或向下舍入。对于 16 毫秒的延迟,动画将以每秒 62.5 帧的速度更新。四舍五入到 17 毫秒的延迟将得到 58.824 的帧速率。

我怎样才能使帧速率刚好达到每秒 60 帧?

提前致谢。

最佳答案

我看到两个选项可以帮助您。他们最终以同样的方式实现了同样的事情,但代码或多或少是通用的。我还没有找到任何工具可以为您完成这项工作,因此它需要一些工作。

第一个选择是做这样的事情:

/**
 * Called by the timer when the next iteration is due. Assume that
 * this happens at the right moment.
 */
public void onTimerUpdate() {
  updateAnimation();

  // Compute the next point in time that corresponds to the
  // frame rate you want.
  long nextScheduledTimestamp = getNextTimestampInNanos();

  long nanos = System.timeNanos();
  timer.schedule(task, convertToMillis(nextScheduledTimestamp - nanos));
}

第二个选项是让您获取 java.util.Timer 的副本: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Timer.java

并重写特定于毫秒的位。在 OpenJDK 中的实现中没有任何内容表明其分辨率是特定于毫秒的,因此您应该能够将 Object.wait(millis) 调用替换为 Object.wait(millis, nanos): https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait(long,%20int)

有趣的文章,仅供娱乐:https://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks

关于Java 计时器 Swing 精确到 60 fps,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36387853/

相关文章:

java - Apache -poi。 XSSF。练习册

java - 带排序功能的 JTable 渲染器

java - 将 JTextField 中的整数加一

c - void osSleep(tU32 ticks) - 它是如何工作的(微 Controller 中的定时器)?

计算C程序中特定函数所花费的时间

c# - 在继续 for 循环之前如何等待计时器结束?

java - 根据用户输入的最大值和最小值在java中生成随机数

java - 平均前导零

java - 像 startsWith() 不是 equals() 这样的快速字符串搜索

java - 桌面应用程序的 Swing 与 JavaFx