Algorithm 如何在程序游戏世界中管理2D数据

Algorithm 如何在程序游戏世界中管理2D数据,algorithm,procedural-generation,quadtree,procedural-programming,procedural,Algorithm,Procedural Generation,Quadtree,Procedural Programming,Procedural,我正在制作一个以星际飞行为灵感的2D太空探索游戏,游戏有一个程序化的世界。游戏分为不同的“场景”(使用戈多术语)来管理游戏的不同“深度”。例如,星际飞行是一个场景,其中恒星系统仅由恒星精灵表示。当玩家进入射程时,视图将移动到太阳系场景,玩家将船移动到实际太阳系内 到目前为止,很好,我从一个硬编码的坐标和种子数组生成了宇宙(太阳系)。现在我还想让宇宙生成程序化,但我猜在内存中加载整个宇宙(一旦程序化,太阳系的数量就没有真正的限制)是没有效率的 我正在考虑在第一次运行时生成宇宙并将数据保存到文件中,

我正在制作一个以星际飞行为灵感的2D太空探索游戏,游戏有一个程序化的世界。游戏分为不同的“场景”(使用戈多术语)来管理游戏的不同“深度”。例如,星际飞行是一个场景,其中恒星系统仅由恒星精灵表示。当玩家进入射程时,视图将移动到太阳系场景,玩家将船移动到实际太阳系内

到目前为止,很好,我从一个硬编码的坐标和种子数组生成了宇宙(太阳系)。现在我还想让宇宙生成程序化,但我猜在内存中加载整个宇宙(一旦程序化,太阳系的数量就没有真正的限制)是没有效率的

我正在考虑在第一次运行时生成宇宙并将数据保存到文件中,但我想知道如何以一种高效的方式加载相关数据,使我只加载玩家飞船周围的特定“半径”数据。我觉得如果我使用生成«真实»星系形状的生成算法,这将是一条可行之路,因为这意味着数据处理的许多步骤(生成不同的星团形状、臂、斑点等,然后恒星围绕中心旋转以模拟星系旋转等)这可能太长,无法实时计算

我想知道我应该采取什么方法来解决这个问题。它实际上并不依赖于语言或引擎,因此参考关于该主题的通用文章和算法就足够了

我也读了一些关于四叉树的书,我想我已经了解了一些东西,但我不确定如何在磁盘上的文件中使用它


提前感谢您的帮助

我有一些建议:

  • 不要在第一次运行时生成整个宇宙,只生成以某种方式可见的区域。然后,不用从磁盘加载整个宇宙,只要你的宇宙飞船(或任何东西)到达该区域的视距范围内,你就可以生成它。这使得游戏初始化速度大大加快,并允许(几乎)无限的宇宙
  • 如果你想让世界变得可修改,只存储玩家所做的“编辑”。因此,如果要显示宇宙的一部分,请从种子生成该部分,然后覆盖存储的编辑。这使得存储空间小得多
  • 对于磁盘上的存储,请看一看R-Tree,特别是它们是为在磁盘页面中存储数据而设计的
      我有一些建议:

      • 不要在第一次运行时生成整个宇宙,只生成以某种方式可见的区域。然后,不用从磁盘加载整个宇宙,只要你的宇宙飞船(或任何东西)到达该区域的视距范围内,你就可以生成它。这使得游戏初始化速度大大加快,并允许(几乎)无限的宇宙
      • 如果你想让世界变得可修改,只存储玩家所做的“编辑”。因此,如果要显示宇宙的一部分,请从种子生成该部分,然后覆盖存储的编辑。这使得存储空间小得多
      • 对于磁盘上的存储,请看一看R-Tree,特别是它们是为在磁盘页面中存储数据而设计的
      正如TilmannZ所建议的,在开始游戏时,您不应该为galaxy生成整个数据集,因为可能没有必要(除非玩家需要一次查看/交互所有数据-例如全明星)。如果是这种情况,例如星图,那么最好一次加载所有数据并将结果保存在图像文件中

      相反,您应该只根据需要在播放器周围生成数据。最明显的方法是围绕玩家构建一个网格,并在玩家移动时保持该网格以玩家为中心。当玩家四处移动时,只需更新每个单元的概念星系坐标(而不是渲染坐标)。然后,对于每个单元,您可以使用坐标作为值或渐变生成器(如Perlin)的输入,以确定在该位置应生成哪些特征


      至于“塑造”星系或宇宙,一种有效的方法是对具有你想要的形状的星系灰度图像的像素数据进行采样。您可以在运行时加载图像的RGB数据,并在生成恒星时使用栅格坐标来获得RGB值,该值可用作恒星生成的密度因子;像素越白,该位置的恒星密度越高,反之亦然。这种方法可以让你在绘画中有效地画出星系的形状。

      正如蒂尔曼兹所建议的那样,你不应该在游戏开始时为星系生成整个数据集,因为可能没有必要(除非玩家需要一次看到/交互所有数据-例如全明星)。如果是这种情况,例如星图,那么最好一次加载所有数据并将结果保存在图像文件中

      相反,您应该只根据需要在播放器周围生成数据。最明显的方法是围绕玩家构建一个网格,并在玩家移动时保持该网格以玩家为中心。当玩家四处移动时,只需更新每个单元的概念星系坐标(而不是渲染坐标)。然后,对于每个单元,您可以使用坐标作为值或渐变生成器(如Perlin)的输入,以确定在该位置应生成哪些特征

      至于“塑造”星系或宇宙,一种有效的方法是对具有你想要的形状的星系灰度图像的像素数据进行采样。您可以在运行时加载图像的RGB数据,并在生成星星时使用栅格的坐标来获取RGB v