質問
私が念頭に置いているのは、さまざまな場所で構築するものや、そのような場所をつなぐ労働者/運送業者がいるようなシミュレーションゲームです。
入植者シリーズのようなもの。
現時点ではグラフィックスは必要ないと仮定しましょう。それは管理できると思います。
だから私の疑問は次のとおりです:
- すべてのエンティティはクラスであり、各エンティティにはスレッドが必要ですか?
- エンティティはクラス内のリストにグループ化され、各エンティティにはスレッドが必要ですか?
実装1を採用すると、低スペックのマシンで実行するのが非常に難しくなり、多数の場合にうまく拡張できません。
実装2を採用した場合、リソースの面では改善されますが、...
エンティティをグループ化するにはどうすればよいですか
- 一般的な家のためのクラスがあり、それを管理するためのインターフェイスリストがありますか?
- 特定のグループの家のためのクラスを持ち、それを管理するためのオブジェクトリストを持っていますか?
そしてスレッドはどうですか?
- 単純なメインゲームループが必要ですか?
- クラスグループごとにスレッドを作成する必要がありますか?
- 労働者/運送業者はどのように写真に収まりますか?
解決
通常のアプローチでは、スレッドをまったく使用せず、エンティティをステートマシンとして実装します。次に、メインループは次のようになります。
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ループからその処理を実行したくないためです。