gpt4 book ai didi

java.util.Timer - 事件之间的速度不一致?

转载 作者:行者123 更新时间:2023-12-02 08:04:43 30 4
gpt4 key购买 nike

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

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

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

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

最佳答案

由于您要移动 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 和时钟更改存在一些微妙的问题。)

关于java.util.Timer - 事件之间的速度不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8365088/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com