1

クライアントごとのスレッドモデルを使用してゲームに取り組んでいます。ゲームは、0.5秒ごとにすべてのプレーヤーを更新する必要があるように動作します。更新はすべて0.5秒間隔で行われる必要があるため、すべて同時に実行する必要があります。私の考えは、「グローバル更新」がいつ行われる必要があるかを追跡するクラスを用意し、その時が来たら、すべてのプレーヤーを調べて、更新するように指示することです。

 for(Player p : currentPlayers) {
     p.update();
 }

問題は、すべてのプレイヤーが独自のスレッドを持っているので、すでにそこにあるので、プレイヤーにその事実を利用してもらいたいということです。別のクラスからの更新を実行すると、数百のスレッドが個別に実行できることを実行する1つのスレッドがあります。スレッドがクラスPlayerのメソッド'update()'を呼び出す場合、それを呼び出したスレッドとは異なるスレッドがそれを実行するように、またはおそらく同じ目標を達成できる別のアプローチになるように、どのように設計できますか?

説明が必要な場合は、お問い合わせください。どうもありがとう!

更新:皆さんはこれについてどう思いますか(投稿で大量のコードをフォーマットする方法がわかりません!):

更新2:前回リセットするには、すべてのプレーヤーがいつ更新を終了するかを知る必要があることに気づきました...

パブリッククラスPseudoExampleはRunnableを実装します
{{
    //「players」がアクティブなプレーヤーでいっぱいであると想定します。
    プライベートプレーヤー[]プレーヤー=新しいプレーヤー[100];
    private long lastUpdate = System.currentTimeMillis();

    public void run()
    {{
        while(true)
        {{
            if(System.currentTimeMillis()-lastUpdate> = 500)
            {{
                for(Player p:players)
                {{
                    p.update = true;
                }
            }

            試す
            {{
                Thread.sleep(10);
            } catch(InterruptedException e)
            {{

            }
        }
    }

    プライベートクラスPlayerはRunnableを実装します
    {{
        プライベートブール更新=false;

        public void run()
        {{
            while(true)
            {{
                if(更新)
                {{
                    //ここで更新します...
                }

                試す
                {{
                    Thread.sleep(10);
                } catch(InterruptedException e)
                {{

                }
            }
        }
    }
}
4

1 に答える 1

2

これを処理する最善の方法は、p.update()を呼び出す代わりに、非同期メッセージをpに送信することだと思います。これはハンドラー機能を使用します。これはおそらく最もクリーンな方法ですが、メッセージの受け渡しによっていくらかの(おそらく些細な)オーバーヘッドが発生すると思います。

したがって、ティックスレッド(つまり、グローバル更新を呼び出すスレッド)には、各クライアントスレッドのHandlerオブジェクトへの参照があります。すると、あなたは次のようになります

for (Player p : currentPlayers) {
    p.handler().sendMessage(); // this isn't exactly the syntax
}

また、Playerには、Handlerを拡張してhandleMessage(Message)をオーバーライドするPlayerHandlerオブジェクトがあります。

編集:質問へのコメントは良いものです-必要以上のスレッドを使用しないでください。それらは「正しい」抽象化のように見えるかもしれませんが、潜在的にトリッキーな問題を大量にもたらします。すべての計算をティックの間に実行する必要がある場合は、順次実行するかどうかは問題ではない可能性があります。

于 2012-04-13T00:37:56.220 に答える