【问题标题】:Refactoring Java Periodic Tasks重构 Java 周期性任务
【发布时间】:2010-10-20 00:44:00
【问题描述】:

我正在尝试一些游戏机制,并尝试模仿《魔兽世界》的周期性事件,例如“每 z 秒 x 次伤害”。到目前为止,我已经使用 Timers 来安排定期任务,在这种情况下,我试图重新生成健康,但是否真的有必要通过“this”来修改实例变量_mana?我真的需要一个单独的 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);
    }
}

【问题讨论】:

    标签: c# java oop


    【解决方案1】:

    如果regeneratorManaResource 的内部类,那么您不需要将this 作为参数传递。内部类隐式引用了外部类'this

    但是,要访问 this,您需要在其前面加上外部类名:

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

    因为regenerate 实例也有自己的this

    我希望这是有道理的。那里有很多这样的东西。

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

    【讨论】:

    • 我没有意识到你可以从内部类中访问“this”,因为在我开始使用 Java 之前,我从未读过关于类中的类。
    【解决方案2】:

    这通常在大多数 MMO 中起作用,有某种“脉冲”。每 X 秒,所有周期性的事情都会发生。出于某种原因,我认为在 Everquest 2 中是 6 秒,在 WOW 中是 2 秒,但我已经很长时间没有仔细研究这些东西了 :)

    您希望在游戏循环中进行某种检查,以检查“是时候做周期性的事情了”。你希望在你的“tick”长度过去后尽快发生。如果你决定每秒做一个“tick”,那么你在 1.0 秒和 1.1 秒做你的事情并不重要。

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

    【讨论】:

      猜你喜欢
      • 2019-05-25
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 2016-09-26
      相关资源
      最近更新 更多