使用更少的计时器

时间:2013-05-18 20:09:32

标签: java multithreading timer delay priority-queue

在我的游戏中并没有真正落后那么多,但我知道通过减少Timer的运行,我可以减少游戏中的大量延迟。该游戏有多个Timer,因为它有一个Timer更新所有内容,如玩家位置和所有障碍,然后我有其他Timer我用来移除强力你可以得到。

例如,我有一个Timer,它的初始延迟设置为5000,当它运行一次(它只运行一次)时,它将删除一个特定的电源,我有另一个{{将它的初始延迟设置为20 000.我如何保持每个计时器的不同延迟,但仍然只使用一次或至少比我现在使用的发烧?

无论如何,我可以使用TimerPriorityQueue来完成此任务吗?如果是这样的话?

2 个答案:

答案 0 :(得分:0)

如果你想再次运行相同的任务,你可以在scheduleScheduledThreadPoolExecutor任务,然后重新安排它们以获得不同的延迟。

另一种选择是使用DelayQueue来存储您要执行的任务,并使用单独的线程到take并从队列中执行runnables。与ScheduledThreadPoolExecutor一样,如果您希望它们再次运行,则必须将runnables重新放回队列,并再次运行。

ScheduledThreadPoolExecutor允许您安排任务在固定延迟后连续运行,而DelayQueue则要求您在运行后将任务重新放回队列。

答案 1 :(得分:0)

为什么会有一个“更新所有内容”的计时器?更新应始终执行不间断。 (除非你想把你的游戏限制在不变的FPS) 你真的应该考虑滥用“游戏循环”:

While Game Is Running
    Update() 
    Draw() 
End While

如果您不想在游戏中出现任何滞后,则需要考虑始终更新玩家位置等... 也就是说,当您更新位置等时......您需要确保相对于自上次执行Update()以来经过的时间来制作它们。

如果你不是经常调用Update(),那么无论你使用什么线程模式,你都会有滞后。