程序性地生成一个大规模的宇宙

时间:2011-12-16 18:37:56

标签: java multithreading memory procedural-generation

我正在创建一个基于文本的游戏,并尝试实现程序世界生成。

我最初的计划有点杂乱无章:每个宇宙都有一个星系的三维星系,太阳系,然后又随机天体传播。我打算单独生成实际的本地区域,但我不确定它是否可以像我一样完成任务。

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个字节也无法存储。

我最初对阵列数组的意图是能够有效地将群集组合在一起,更好地帮助识别玩家在宇宙中的位置。

我的问题是:如何更有效地创造这样规模的世界?

2 个答案:

答案 0 :(得分:9)

不是试图存储生成的宇宙,只需为每个玩家创建一个独特的随机种子值,并在玩家玩游戏时使用它来在程序上生成动态世界。

每次使用相同的值为您的生成器播种时,随机数每次都相同。因此,如果我的唯一随机玩家ID为654156475,则在我加载游戏时将该ID放入Universe生成器,并且生成器每次都会生成相同的Universe。不同的玩家会获得不同的宇宙,因为他们的种子与我的不同。

请参阅this article的“视频游戏”部分,详细了解如何在游戏中使用此技术。

或者,不是将其写为宇宙生成器,而是将其写为太阳系发生器(或者是玩家将占用的最小空间单位)。然后,为每个太阳系存储随机种子,并使用这些种子(这将是相对少量的数据)来生成(并在以后重新生成相同的内容)随着玩家的游戏而飞。

这种方法的主要优点是您只需将种子值存储在磁盘上,这是一个非常少量的数据,您根本不必存储Universe数据。不仅如此,在飞行中只重新生成宇宙的一小部分通常比从磁盘加载它快得多。

答案 1 :(得分:5)

很多年前做过类似你描述的事情(当PC有两个5.25“软盘驱动器时)我不会预先将整个游戏分配到内存中。你应该将其分解,以便游戏加载部分内容。播放器所在的宇宙,例如10x10x10的3D块。当游戏漫游移动到加载空间的边界时,将该空间写入磁盘并读入它们移入的空间。