2011-12-16 12 views
2

私はテキストベースのゲームを作成し、手続き型の世代を実装しようとしています。大規模なユニバースを手続き的に生成する

私の初期の計画は少しばかげていました。それぞれの宇宙は太陽系の銀河の3次元配列を持っています。それから、順番に無作為化された天体が広がります。私は実際にローカルエリアを別々に生成するつもりだったが、現時点では私が持っている通りに作業を完了することは現在できていない。

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が4バイトであっても保存できない(((ClassSize^3)^ 3)^ 3)バイトを必要とします。

配列の配列を使用する意図は、クラスターを効率的にグループ化し、プレーヤーがどこにいたのかをより明確にすることでした。

私の質問は、どうすればこのようなスケールの世界をより効率的に生成できますか?

+0

これは、 '_int_'が**本当に** javaの' a [2] [2] [2] 'はintの配列への2つのrefの配列に対する2つのrefの配列を意味するため、あなたは6つのリファレンスと8つのint(この場合)を持っています。場所の計算では1次元配列を使用してください。 –

+1

実際には、classsize *(システムごとのボディ^ 3)*(gal per system axy^3)*(宇宙あたりの銀河^ 3)。あなたの最小の数字のために、4バイト* 5^3 * 50^3 * 10 * 3〜= 58GB。プレーヤーの視点から見ると、各ボディに5秒を費やすには2500年かかるので、そのデザインの一部を再考したいと思うかもしれません。 – Thomas

答えて

9

結果の宇宙を保存しようとするのではなく、プレーヤーごとに一意のランダムなシード値を作成し、それを使ってプレーヤの再生中に手作業で世界を生成します。

毎回同じ値でジェネレータをシードすると、乱数は毎回同じになります。したがって、私のユニークなランダムなプレーヤーIDが654156475なら、ゲームをロードするときにそのIDをユニバースジェネレータに投げてください。ジェネレータは毎回同じユニバースを生成します。彼らの種子は私のものとは異なるので、別のプレイヤーは異なる宇宙を得るでしょう。

this articleの「ビデオゲーム」のセクションで、ゲームでこのテクニックを使用する方法の概要を参照してください。

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

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

5

何年も前に何度か記述したようなことをやったことがありましたが(私のPCには5.25インチのフロッピードライブが2つあったのですが)、ゲーム全体をメモリにあらかじめ割り当てないでしょう。プレイヤーがいる宇宙、例えば10x10xの3Dブロックで言います。遊びが読み込まれたスペースの境界を越えて移動すると、そのスペースをディスクに書き込んで、移動したスペースを読み込みます。

関連する問題