3

例として Minecraft のレッドストーンを取り上げます。これは基本的に、次の基本ルールを持つ 15 状態のセル オートマトンです。

Redstone -> Redstone, powered of level Max(neighbours)-1

およびさまざまな接続要素の追加ルール

Repeater, inactive -> Repeater, active, level 2 if its input is powered
Repeater, active, level 2 -> Repeater, active, level 1
Repeater, active, level 1 -> Repeater, inactive
Redstone, unpowered -> Redstone, powered if there is a neighbouring Repeater, level 1 or another source

(CA を使用して Minecraft を実装する方法について詳しく書いています: http://madflame991.blogspot.com/2011/10/cellular-automata-in-minecraft.html )

さて、私の質問は次のとおりです。ゲームはどのようにして巨大なレッドストーンの仕掛けを更新するのでしょうか? どのようなデータ構造を使用していますか? それは本当にセルオートマトンとして実装されていますか? そうでない場合、あなたの最良の推測は何ですか?

追伸: 実際のソース コードをのぞいてみてくださいと言っているわけではありませんが、この技術的なことがどのように実現されているかを推測するだけです。...そして、私はこれをSOに投稿していますが、gamedevには投稿していません。これは、CAの質問であり、gamedev関連の質問ではないためです。

4

3 に答える 3

1

気が遠くなるほど大規模なセル オートマトン(たとえば、ゲーム オブ ライフのゲーム オブ ライフ)をシミュレートする別の可能なアプローチは、パターン (グライダー、グライダー ジェネレーターなど) を検出し、それらの将来の進化を予測し、未知の部分 (グライダー) のみを計算することです。進化)。

于 2016-05-20T14:16:53.437 に答える
0

これを行うための明白な方法は、ワールドをチャンクに分割し (マインクラフトはすでにそれを行っています!)、各チャンクをサーバーに割り当てることです。各サーバーは、そのチャンクへの更新を処理し、隣接するチャンクを担当するサーバーと通信して、状態を伝達します。

このようなセル オートマトンの場合、各チャンクは、タイム ステップをインクリメントする前に、エッジ セルの現在の状態を隣接するすべてのチャンクに伝達する必要があります。チャンク領域は O(n^2) で増加しますが、周囲は O(n) でのみ増加するため、通信オーバーヘッドはチャンクが大きくなると減少することに注意してください。

実際には、それほど同期的ではなく、各チャンクは内部のレッドストーンを非同期的にシミュレートし、イベントが発生した場合にのみ隣接するチャンクに更新を送信し、他のすべてのチャンクと同期を維持しようとしないことがわかると思います.

于 2012-04-27T04:23:44.227 に答える
0

Hashlife ( 1 ) は、非常に巨大なスペースで計算を高速化することにより、探しているものになる可能性があります。

于 2016-12-02T14:26:53.007 に答える