重构Java周期性任务

时间:2010-10-20 00:44:01

标签: c# java oop

我尝试了一些游戏机制,我试图模仿WoW的周期性事件,例如“每z秒造成x次伤害”。到目前为止,我已经使用了Timers来安排定期任务,在这种情况下,我正在尝试重新生成健康,但是为了修改实例变量_mana,是否真的有必要传递“this”?我是否真的需要一个单独的TimerTask类来“每z秒重新生成x个健康状况”?

在C#中,我知道只需创建一个通过方法处理滴答的计时器,我就能做到这一点。我如何用Java做到这一点?或者这段代码是否合适(高效)?

private int _mana;

public void regenerate(int amount, int rate)
    {
        _regenerator = new Timer();
        _regenerator.scheduleAtFixedRate(new regenerator(this, amount), 0, rate*1000);
}

public class regenerator extends TimerTask
{
    private ManaResource _mr;
    private int _amount = 0;

    public regenerator(ManaResource mr, int amount)
    {
        _mr = mr;
        _amount = amount;
    }

    public void run()
    {
        _mr._mana += _amount;
        System.out.println(_mr._mana);
    }
}

2 个答案:

答案 0 :(得分:1)

如果regeneratorManaResource的内部类,那么您不需要将this作为参数传递。内部类具有对外部类“this

的隐式引用

要访问this,您需要在前面添加外部类名称:

public void run() {
    ManaResource.this._mana += _amount;
}

因为regenerate实例也有自己的this

我希望这是有道理的。这里有很多'那里。

你需要一个新的TimerTask类来“每y秒重新生成x”;没有轻量级的方法来传递Java中的函数。

答案 1 :(得分:1)

这种方式通常适用于大多数MMO游戏,有一种“脉冲”。每隔X秒,就会发生所有周期性的事情。出于某种原因,我认为在Everquest 2中它是6秒,在WOW中是2秒,但是自从我详细研究这些东西以来已经很长时间了:)

你在游戏循环中想要的是某种检查“是时候做周期性的事了”。你希望在你的“滴答”长度过后尽快发生。如果你决定每秒做一次“滴答”,那么你在1.0秒和1.1秒之间做你的东西并不重要。

我会谨慎地在计时器或单独的线程中执行此操作,因为您需要处理各种同步问题。将核心逻辑保存在一个线程中。如果性能问题,您可以在以后的更多线程中添加花哨的东西。