当前位置: 首页 > 知识库问答 >
问题:

Java定时器摆动正好60 fps

宋唯
2023-03-14

我在JPanel中有一个动画,它通过javax.swing.Timer更新自己。如果我让JPanel每秒更新60次,我会将延迟设置为1000/60 = ~16.6666。然而,这个延迟必须是一个整数,所以我可以选择向上或向下取整。对于16毫秒的延迟,动画将以每秒62.5帧的速度更新。向上舍入到17毫秒延迟将给出58.824的帧速率。

我怎样才能达到每秒60帧的帧速率呢?

提前谢谢。

共有2个答案

燕靖
2023-03-14

事情远没有那么复杂!你可以很容易地完成repaint()或其他任何你需要的方法,用现有的最大的循环每秒钟调用60次

while(true) {
    repaint ();
    try {
         Thread.sleep(1000/60);
    } catch (InterruptedException e) {
    }
}

我在脚本的主方法中调用它,但基本上它是一个无限循环,因为true将始终等于true,然后它调用repaint,告诉循环Hibernate一帧,然后再次调用repaint。1000/60 睡眠将导致此循环每秒正好被调用 60 次

堵鸿光
2023-03-14

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

第一种选择是这样做:

/**
 * 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, int)

有趣的文章,只是为了好玩:https://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks

 类似资料:
  • 我觉得摇摆计时器有问题。我写了一些运行良好的代码,然后将其全部移动到我的新计算机上,但它很快就无法工作。我用这个方法编写了一个GUI类(基于JFrame): 该方法是从另一个类调用的。真是太夸张了。splash guy是一个只运行splash动画的JPanel类。它通过摆动计时器来实现。在splash类中,侦听器通过以下代码调整我的帧的内容: 现在,如果第一个块中的print语句被注释掉,我的程序

  • 我一直在做一个项目。在项目的一部分中,我需要使用JPanel。Graphics2D对象被传递给框架的模型部分,模型将在该实例中绘制它需要的任何内容。问题是JFrame未正确呈现。它看起来是半白色的阴影和不正确的绘画。它在我的笔记本电脑(索尼Vaio和Windows7)上运行良好,但在我测试的所有其他系统(2台戴尔笔记本电脑、windows8;1台Thoshiba和Windows7;1台三星和win

  • 此代码在启动时执行一次。然后JButton位于中间。加载下一个图像时再次执行,此时JButton已处于正确位置。 我已经尝试了很多方法,比如将JButton添加到JFrame中,将JPanels布局设置为null(使button不可见),重新绘制、打包、无效,但我尝试的一切似乎都不奏效。有人能指示Swing把那个JButton放在我的JFrame的右上角吗?非常感谢!

  • 问题内容: 我在游戏中使用了摇摆计时器,但是当游戏运行时,它似乎有平稳运行的时刻和减速的时刻。 为什么时间在波动? 我该如何解决? 这是我的代码示例。在我的实际程序中,我正在绘制图像,而不仅仅是矩形。还有很多碰撞检测和其他小的计算正在发生。 另外,这是游戏的Jar文件的链接,因此您可以运行它,(满是)明白我的意思。http://dl.dropbox.com/u/8724803/Get%20To%2

  • 我在Swing和设置角色动画方面有一些问题,我有一个带有关键侦听器的JFrame,当用户点击时,它在这里调用我的JPanel方法 这个动画我的角色,但这么快,我们可以看到一个东西,我怎么才能看到动画?

  • 我正在用摇摆计时器打卡NetBeans: 我只是用System.out.print来测试程序,它不是真正程序的一部分。我调用停止()方法,但计时器继续计数。此外,我通过但它的计数速度是原来的两倍。有人能帮忙吗? 编辑: 这是我的计时器(有点像SSCCE): 它不能正常工作,因为秒没有出现,但它确实显示了20次,这就是我想要的。这只是在它自己的应用程序中,在我的实际程序中更容易看到问题。 我注意到游