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

Mat*_*cus 2 java memory multithreading procedural-generation

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

我最初的计划有点随意:每个宇宙都有一个星系的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].
Run Code Online (Sandbox Code Playgroud)

然后将所有这些写出到数据文件中以便稍后读取.

现在看一下,如果我没有弄错的话,这将需要(((ClassSize ^ 3)^ 3)^ 3)字节,即使ClassSize只有4个字节也不可能存储.

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

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

jef*_*unt 9

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

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

见的"视频游戏"一节本文为这种技术是如何在游戏中使用的简要概述.

或者,不要将其写为宇宙生成器,而是将其写为太阳系发生器(或者是玩家将占用的最小空间单位).然后,为每个太阳系存储随机种子,并使用这些种子(这将是相对少量的数据)在玩家玩时动态地生成(并且稍后重新生成相同的东西)游戏场.

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


小智 5

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