4

私が考えているシミュレーション ゲームは、さまざまな場所に建設するものと、それらの場所をつなぐワーカー/トランスポーターがあるようなものです。

入植者シリーズのようなもの。

現時点では、私が管理できると思うグラフィックが必要ないと仮定しましょう。

したがって、私の疑問は次のとおりです。

  1. すべてのエンティティをクラスにして、それぞれにスレッドを持たせる必要がありますか?
  2. エンティティをクラス内のリストにグループ化し、それぞれにスレッドを持たせる必要がありますか?

実装 1 を使用すると、低スペックのマシンで実行するのが非常に難しくなり、多数の場合はうまくスケーリングされません。

実装 2 を採用すれば、リソースの点では良くなりますが、その場合は...

エンティティをグループ化するにはどうすればよいですか?

  1. 一般的な住宅用のクラスがあり、それを管理するためのインターフェイス リストがありますか?
  2. 家の特定のグループのクラスがあり、それを管理するためのオブジェクト リストがありますか?

スレッドはどうですか?

  1. 単純なメイン ゲーム ループを使用する必要がありますか?
  2. クラスグループごとにスレッドを作成する必要がありますか?
  3. 労働者/運送業者はどのように写真に収まりますか?
4

6 に答える 6

14

通常のアプローチではスレッド化をまったく使用せず、エンティティをステートマシンとして実装します。次に、メインループは次のようになります。

 while( 1 )
{
    foreach( entity in entlist )
    {
        entity->update();
    }

    render();
}
于 2008-10-02T00:19:45.327 に答える
4

MMORPG Eve Online は、スタックレス python とアクター モデルを使用して、リソース ヒットなしでエンティティごとのスレッド システムをエミュレートします。

詳細については、このリンクを確認してください: http://harkal.sylphis3d.com/2005/08/10/multithreaded-game-scripting-with-stackless-python/

于 2008-10-02T00:36:14.133 に答える
2

ゲーム ロジックを実行するスレッドを 1 つだけにしたいという方もいらっしゃると思います。複数のスレッドを使用しても速度は向上せず、コードが混乱するだけです。メインのゲーム ループがあるのはまったく問題ありませんが、ゲームにマルチプレイヤーがある場合はややこしくなります。

あなたの質問のクラスに関する部分について、私は少し混乱しています。あなたの質問を正しく理解できれば、家のタイプ (養豚場、風車など) ごとに共通の抽象基本クラスから派生するクラスを用意することをお勧めしますHouse。次に、ゲーム ワールド内のすべての家を家のリストに保存します。

于 2008-10-02T00:17:40.060 に答える
1

Erlang の使用を考えてみてください。Erlang を使用すると、通常のシステム スレッドよりも多くのプロセス (= 軽量スレッド) を生成できます。さらに分散されます。つまり、システムが十分でない場合は、別のノードを追加します。

もう 1 つの代替手段は、スタックレス python (または現在の python 代替手段) です。これは、ゲーム エンジンにとって非常にクールな軽量スレッドもサポートするためです。Eve Online はそれをサーバーに使用しています。ただし、配布されていませんが、手動で簡単に実現できます。

于 2008-10-03T02:15:17.770 に答える
1

@Mike Fによる答えはほとんど正しいですが、foreachサイクル内のエンティティの反復により、評価の順序が大幅に決定論的になり、望ましくない副作用があることに注意する必要があります。一方、スレッドを導入すると、ハイゼンバグや並行性の問題が発生する可能性が生じるため、私が見て使用した最善の方法は、2 つのサイクルを組み合わせることです。最初のサイクルは、以前の状態に基づいてエージェント/ワーカーからアクションを収集し、2 番目のサイクルはアクションの結果とシミュレーションの状態を更新します。バイアスの可能性を避けるために、各サイクルで評価の順序がランダム化されます。この BTW は、各サイクルの終わりに同期を条件として、大規模な並列評価にスケーリングします。

于 2012-10-08T12:08:00.930 に答える
0

エンティティごとに個別のクラスを作成することは避けます。共有機能のコードを繰り返したり、ファンキーな継承ツリーを作成したりする状況が発生するためです。

あなたが望むのは、単一のクラスと、その上に構成された機能を持つオブジェクトであると私は主張します。RTS でまさにこの概念について話しているブログの記事を見ました...待ってください、それは誰かが書いていた設計パターンのツアーだったと思います。

各オブジェクトの DoEvents (より適切な言葉がないため) メソッドでスレッドを生成する Visitor パターンを使用して、この特定のループ中に何をするかを各オブジェクトに指示します。ループの最後でスレッドを同期します。実際には 5 ループ前に破棄されたのに、複雑なロジックを持つ一部のオブジェクトが 10 ループ前から処理を実行したくないためです。

于 2008-10-02T00:32:55.950 に答える