2

テキストベースのゲームを作成しており、プロシージャル ワールド生成を実装しようとしています。

私の最初の計画は少しでたらめでした。各宇宙には、銀河や太陽系の 3D アレイがあり、ランダム化された天体が順番に伝播されます。実際のローカル エリアを個別に生成する予定でしたが、現在のタスクを完了できるかどうかはわかりません。

Each universe is a Galaxy[10][10][10] (arbitrary number at the moment),
each galaxy is a randomly sized SolarSystem[50-150][50-150][50-150],
each SolarSystem is a randomly sized CelestialBody[5-20][5-20][5-20].

これらはすべて、後で読み取るためにデータファイルに書き出されます。

今見ると、たしかに(((ClassSize^3)^3)^3)バイト必要で、ClassSizeが4バイトでも格納できない。

配列の配列を使用する最初の目的は、クラスターを効率的にグループ化し、プレイヤーがユニバースのどこにいるかをより適切に特定できるようにすることでした。

私の質問は、どうすればこのような規模の世界をより効率的に生成できるでしょうか?

4

2 に答える 2

9

結果のユニバースを保存しようとするのではなく、プレイヤーごとに一意のランダムなシード値を作成し、それを使用して、プレイヤーがプレイするときにその場で世界をプロシージャルに生成します。

ジェネレーターに毎回同じ値をシードすると、乱数は毎回同じになります。したがって、私の一意のランダム プレイヤー ID が654156475である場合、ゲームをロードするときにその ID をユニバース ジェネレーターに投入すると、ジェネレーターは毎回同じユニバースを生成します。彼らのシードは私のものとは異なるため、別のプレイヤーは別の宇宙を取得します。

この技術がゲームでどのように使用されるかについての簡単な概要については、この記事の「ビデオ ゲーム」セクションを参照してください。

または、ユニバース ジェネレーターとして記述する代わりに、太陽系ジェネレーター (またはプレイヤーが占有するスペースの最小単位) として記述します。次に、各 Solar Systemのランダム シードを保存し、それらのシード (比較的少量のデータになります) を使用して、プレイヤーがプレイするときにオンザフライでプレイ フィールドを生成 (および後で同じものを再生成) します。

このアプローチの主な利点は、シード値をディスクに保存するだけでよく、これは非常に少量のデータであり、ユニバース データをまったく保存する必要がないことです。それだけでなく、その場でユニバースの小さな部分だけを再生成すると、ディスクからロードするよりもはるかに高速になることがよくあります。

于 2011-12-16T18:45:56.083 に答える
5

何年も前にあなたが説明したようなことをしたので(PCに5.25インチのフロッピードライブが2つあったとき)、ゲーム全体をメモリに事前に割り当てませんでした。ゲームがユニバースの一部をプレーヤーにロードするように分割する必要がありますたとえば、10x10x10 の 3D ブロックの中にあります。プレイがロードされたスペースの境界を越えて移動するとき、そのスペースをディスクに書き出し、それらが移動したスペースを読み込みます。

于 2011-12-16T18:46:46.190 に答える