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 メソッドは、TimerまたはScheduledExecutorServiceを使用して、0.5 秒ごとに実行されるようにスケジュールされています。

問題はupdateメソッドであり、いつでも別のスレッドによって呼び出されます。だから私は尋ねます:

1 -フィールドsynchronizedを保護するために 使用するとどうなりますか? stateタイマーは待機しますか?「待機期間」はどのように補償されますか?

2 - これを行うより良い方法はありますか? 多分 movesいくつかのキューに保存しますか?

ありがとう!

4

2 に答える 2

0

この問題に対処するもう 1 つの方法は、更新スレッドから入ってくる更新をQueueなどに移動させることです。このようにして、調整中の状態の反復ごとに、キューからすべての更新を取得して、同じスレッドに適用できます。

この方法を使用すると、更新スレッドとゲーム ループ スレッドの間で競合が発生することはありません。

個人的には、何かをスケジュールする代わりに、なんらかの調整メカニズムを利用する while ループを使用します。System.nanoTime()を使用して、タイム デルタを使用して更新を適用できます。これにより、ロジックの実行がマシンのパフォーマンスに拘束されないことが保証されます。

このトピックに関するすばらしい記事がここにあります。

于 2013-08-29T18:52:39.280 に答える