代码之家  ›  专栏  ›  技术社区  ›  Relequestual

我应该为这个动画使用SwingWorker、线程还是递归更新?

  •  1
  • Relequestual  · 技术社区  · 17 年前

    正如我在前面的问题中所说,我对Java还是新手。 我正在用Java开发一个基于tile的游戏。运动在网格上。我正处于实施角色运动的阶段。

    我的计划是使用我粘贴的代码 this question

    作为一个解决问题的人,我一整天都在思考这个问题,我有一个想法。 我可以通过做一些不同的事情来达到同样的效果。

    那样行吗?在游戏后期,可能会有100人左右。20毫秒的时间是否足够让所有人循环,并让他们离目的地更近一个单位?20毫秒是不是太短了?难道我一点道理都没有?

    欢迎您的意见/答案/想法:)

    3 回复  |  直到 9 年前
        1
  •  2
  •   James    17 年前

    我几乎同意Bill所说的一切,特别是关于Swing的神秘部分(尽管实际上并不比其他图形环境更神秘)。

    举几个例子,30 fps(这是大多数交错屏幕产生的频率)是每33毫秒1帧。60 fps大约是人类能够感知到的最高频率(1帧/16毫秒),大多数LCD显示器以60或75 Hz刷新,这将是实际产生的绝对最快速度。20毫秒/帧是50帧/秒的帧速率,这也与欧洲地区的电频率一致,只是肉眼可以看到。

    我建议反对的主要做法是在一个紧密的while循环中做每件事。这将导致您的游戏速度高度依赖于您所使用的系统。在速度更快的系统上,你可能会得到帧喷出速度超过玩家的反应速度,即使它在较旧的系统上合理地播放(或者你在破旧的机器上会遇到相反的问题)。使用计时器可以使速率更加一致,但在错过帧截止日期的情况下,必须进行一些防御性检查。这意味着您的计时器需要知道计算何时完成,因此如果另一帧经过但尚未完成,则它将跳过下一帧。更好的是,您可以记录计算之间实际经过的时间,并相应地调整角色的实际移动。

    令人惊讶的是,与我在你的另一个问题上发布的内容相比,我所说的大部分内容实际上都是新的。

        2
  •  2
  •   Neil Coffey    17 年前

    behaviour of Thread.sleep() --从图中可以看出,由于系统处于中等繁忙状态,操作系统无法满足我们要求的睡眠时间。如果你需要100毫秒的平均睡眠时间,那么20毫秒左右的抖动不会太糟糕。但当你要求20ms时,20ms抖动可能会更明显。。。

    所以我可能会以每秒10帧(100毫秒暂停)的速度开始,看看效果如何。

    就代码而言,如果您的游戏逻辑在每个滴答声中花费的时间大致相同,那么我将从逻辑重新绘制每个滴答声的睡眠开始。请记住,您需要同步正在绘制的内容,因此在游戏逻辑线程中,理想情况下,您需要避免长时间持有锁。

        3
  •  1
  •   Bill K    17 年前

    swing的这一领域可能是Java中最“黑魔法”的领域。这可能很棘手,有很多方法。

    因此,在大多数情况下,在一个连续的线程中,在绘制系统之外进行计算,然后在顶级组件中调用重绘函数。重新绘制应该将绘制事件传递到AWT线程上的所有组件,所以这不应该是一个问题。

    这是应该怎么做的,基本的,但它可能会很慢,有很多技巧来加速它。你可能想找一本关于swing编程和游戏的书。