【问题标题】:Procedurally Generating a Massive Universe程序生成一个巨大的宇宙
【发布时间】:2011-12-16 18:37:56
【问题描述】:

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

我最初的计划有点随意:每个宇宙都有一个星系、太阳系的 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 个字节也无法存储。

我最初使用数组数组的目的是能够有效地将集群分组在一起,并更好地帮助确定玩家在宇宙中的位置。

我的问题是:我怎样才能更有效地生成如此规模的世界?

【问题讨论】:

  • 对此有一条评论:在 Java 数组中,如果 _int_真的 会浪费空间,因为 java 的 a[2][2][2] 表示两个引用的数组到两个数组引用整数数组。所以,你有 6 个 refs 和 8 个 int(在这种情况下)。在计算位置时最好使用一维数组
  • 实际上你会有类大小*(每个系统的身体^3)*(每个星系的系统^3)*(每个宇宙的星系^3)。因此,对于您的最小数字,4 字节 *5^3 *50^3 * 10*3 ~= 58GB。从玩家的角度来看,在每个身体上花费 5 秒需要 2500 年,因此您可能需要重新考虑该设计的一部分。

标签: java multithreading memory procedural-generation


【解决方案1】:

与其尝试存储生成的宇宙,不如简单地为每个玩家创建一个唯一的随机种子值,并在玩家玩游戏时使用它来程序化地动态生成世界。

当您每次为生成器播种相同的值时,随机数每次都相同。所以,如果我唯一的随机玩家 ID 是 654156475,那么在我加载游戏时将该 ID 放入宇宙生成器,生成器每次都会生成相同的宇宙。不同的玩家会得到不同的宇宙,因为他们的种子和我的不同。

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

或者,不要把它写成宇宙生成器,而是把它写成太阳系生成器(或者任何玩家将占据的最小空间单位)。然后,为每个太阳系存储一个随机种子,并使用这些种子(这将是相对少量的数据)生成(并稍后重新生成相同的东西)在玩家演奏时飞翔。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      相关资源
      最近更新 更多