質問

私が念頭に置いているのは、さまざまな場所で構築するものや、そのような場所をつなぐ労働者/運送業者がいるようなシミュレーションゲームです。

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

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

だから私の疑問は次のとおりです:

  1. すべてのエンティティはクラスであり、各エンティティにはスレッドが必要ですか?
  2. エンティティはクラス内のリストにグループ化され、各エンティティにはスレッドが必要ですか?

実装1を採用すると、低スペックのマシンで実行するのが非常に難しくなり、多数の場合にうまく拡張できません。

実装2を採用した場合、リソースの面では改善されますが、...

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

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

そしてスレッドはどうですか?

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

解決

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

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

    render();
}

他のヒント

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

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

ゲームロジックを実行するスレッドを1つだけにしたいのはかなり確かです。複数のスレッドを使用しても速度は向上せず、コードが混乱するだけです。ゲームにマルチプレイヤーが含まれている場合は、ややトリッキーになりますが、メインのゲームループは問題ありません。

クラスに関連する質問の部分について少し混乱しています。あなたの質問を正しく理解しているなら、私の提案は、一般的な抽象基本クラス House から派生する各タイプの家(養豚場、風車など)のクラスを持つことです。次に、ゲームワールド内のすべての家を家のリストに保存します。

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

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

@Mike Fの答えはほとんど正しいですが、 foreach サイクルでエンティティを反復すると、評価の順序が著しく決定的になり、望ましくない副作用があることに注意してください。一方、スレッドを導入すると、 heisenbugs および同時実行性の問題が発生する可能性があるため、これまでに見て使用した最良の方法は、2つのサイクルを組み合わせることに依存しています。状態の場合、2番目のサイクルはアクションの結果を構成し、シミュレーションの状態を更新します。バイアスを回避するために、各サイクルで評価の順序がランダム化されます。このBTWは、各サイクルの終わりに同期化されることを条件として、超並列評価に拡張されます。

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

あなたが望むのは、単一のクラスと、その上に機能が組み込まれたオブジェクトであると主張します。ブログで、RTSでこのコンセプトについて語っている記事を見ました...待って、誰かが書いているデザインパターン

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top