【问题标题】:java.util.Timer - inconsistent speed between events?java.util.Timer - 事件之间的速度不一致?
【发布时间】:2011-12-03 02:47:51
【问题描述】:

我正在将 java.util.timer 用于我正在编程以增加 JLabel 的位置的游戏,但它通常比我需要的慢得多。有时它会以正确的速度运行,但下次我执行程序时它会无缘无故地再次变慢。我使用以下代码作为计时器。

java.util.Timer bulletTimer= new java.util.Timer();
bulletTimer.schedule(new bulletTimerTask(), 0, 2);

我也尝试了 javax.swing.timer 并遇到了同样的问题。任何帮助将不胜感激。

编辑:它与另一个计时器一起工作正常,我将延迟设置为 2000 毫秒

【问题讨论】:

标签: java timer


【解决方案1】:

由于您要移动JLabel,我实际上会继续使用(单个)swing.Timer。原因是回调总是“在 EDT 上”发生,因此可以访问 Swing 组件。 (如果您使用的是util.Timer,那么更新应该发布/排队到 EDT,但这涉及更多一点。)

现在,请记住 util.Timerswing.Timer 没有保证时间(除了“将至少 X 长”),为此,重要的是考虑“时间增量”(距离上次更新发生的时间)。

这在Fix Your Timestep! 文章中进行了讨论,虽然这篇文章是关于一个简单的游戏循环而不是计时器,但同样的概念也适用。要获得固定速度(无加速度)的一致更新模式,只需使用:

distance_for_dt = speed * delta_time
new_position = old_position + distance_for_dt

这将解决给定系统上的各种波动——不同的系统负载、进程争用、CPU 功率限制、月相等——以及使不同计算机之间的速度保持一致。

一旦您熟悉了基本的位置更新,就可以使用更“高级”的离散公式来实现更准确的定位,包括那些将加速度考虑在内的公式。

编码愉快。


正如 BizzyDizzy 指出的那样,System.nanoTime 可用于计算时间增量。 (System.currentTimeMillis 和时钟变化有一些微妙的问题。)

【讨论】:

    【解决方案2】:

    您可以使用 Java 5 附带的 System.nanoTime(),它是 Java 中分辨率最高的计时器。它以纳秒为单位提供价值。

    【讨论】:

    • 这如何使计时器更准确?答:不会。事实上,这对 OP 没有帮助,因为如果他的时间精确到微秒,他会很高兴。解决方案由 pst 发布。
    猜你喜欢
    • 2013-11-04
    • 1970-01-01
    • 2017-04-15
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多