0

我正在工作的游戏中有以下情况:

class GameLogic implements Runnable
{
    State state;

    private State changeState()
    {
        //state changes here (note the `private`)
    }

    // this ticks at each 0.5 seconds
    public void run()
    {
      //code that changes state
      changeState();
    }

    // this will be called by a external Thread at any moment
    public void update(Move move)
    {
       //code that changes state
       applyMove(move);
    }

    private void applyMove(Move move)
    {
         //state changes here
         //state = ... doesn't matter
    }

}

上面的 run 方法被安排为每 0.5 秒执行一次,使用TimerScheduledExecutorService

问题是update方法,随时会被另一个线程调用。所以我问:

1 - 如果使用synchronized保护 state字段会发生什么?计时器会等待吗?它将如何补偿“等待期”?

2 - 有没有更好的方法来做到这一点?也许存储 moves在某个队列上?

谢谢!

4

2 回答 2

1
  1. 两者都Timer可以ScheduledExecutorService固定速率或执行之间的固定延迟执行任务。这意味着,具有固定速率的计划任务将补偿执行的运行时间(包括阻塞时间)。具有固定延迟的计划任务不会。有关详细信息,请参阅以下方法的文档:
  2. 总有更好的方法。但是,该解决方案看起来不错。只要它对你有用,就去吧。
于 2013-08-29T17:26:07.007 回答
0

处理这个问题的另一种方法是让来自更新线程的更新进入队列或类似的东西。这样,在调整状态的每次迭代中,您都可以从队列中获取所有更新并将它们应用到同一个线程中。

使用这种方法,更新线程和游戏循环线程之间永远不会有任何冲突。

就个人而言,我会使用一个 while 循环,它利用一些调节机制而不是调度任何东西。您可以使用System.nanoTime()以使用时间增量应用更新。这将确保逻辑的执行不受机器性能的约束。

这里有一篇关于这个主题的精彩文章。

于 2013-08-29T18:52:39.280 回答