代表一个不规则形状的游戏世界

时间:2010-06-03 18:35:30

标签: c#

我正在开展一个游戏世界不规则形状的项目(想想湖的形状)。这个形状有一个网格,坐标放在它上面。游戏世界只在形状的内部。 (再一次,想想湖)

如何有效地代表游戏世界?我知道很多世界基本上是方形的,并且在2维或3维数组中运行良好。我觉得如果我使用一个正方形的数组,那么我基本上是在浪费空间,并且增加了我需要迭代数组的时间。但是,我不确定锯齿状阵列在这里是如何工作的。

gameworld的示例形状

X
XX
 XX   X XX
 XXX XXX
  XXXXXXX
XXXXXXXX
 XXXXX XX
   XX   X
  X

编辑: 游戏世界很可能需要逐步完成每个有效位置。所以我想一个方法可以很容易地做到这一点。

9 个答案:

答案 0 :(得分:4)

与稀疏表示相关的计算开销和复杂性,因此除非边界区域比实际世界大得多,否则简单地接受“浪费”空间可能是最有效的。您实际上是在减少额外的内存使用量,以便更快地访问世界内容。更重要的是,“浪费空间”实现更容易理解和维护,在需要更复杂的实现之前总是更可取。如果你没有足够的证据证明它是必需的,那么保持简单就好了。

答案 1 :(得分:4)

您可以使用quadtree来最小化代表中浪费的空间量。四叉树适用于以不同的粒度划分二维空间 - 在您的情况下,最精细的粒度是游戏方块。如果您有一个没有任何游戏方块的整个20x20区域,则四叉树表示将允许您仅使用一个节点来表示整个区域,而不是像数组表示中那样使用400.

答案 2 :(得分:4)

使用您提出的任何结构 - 您可以随时更改它。如果您对使用阵列感到满意,请使用它。不要担心你要使用的数据结构并开始编码。

在编写代码时,构建远离此底层数组的抽象,就像将其包装在语义模型中一样;那么,如果你意识到(通过剖析)浪费空间或者你需要的操作速度很慢,你可以将它换掉而不会造成问题。在你知道自己需要什么之前不要试图优化。

答案 3 :(得分:1)

使用列表或地图等数据结构,只插入有效的游戏世界坐标。这样你唯一保存的就是有效的位置,并且你不会浪费内存来保存非游戏世界的位置,因为你可以从数据结构中缺少存在来推断那些。

答案 4 :(得分:1)

您可以将世界呈现为(无向)土地(或水)补丁图。然后每个补丁都有一个常规形式,世界就是这些补丁的组合。每个补丁都是图中的一个节点,并且其所有邻居都有图形边缘。

这可能也是任何一般世界中最自然的代表(但它可能不是最有效的代表)。从效率的角度来看,对于高度不规则的地图,它可能会击败一个数组或列表,但对于一个非常适合矩形(或其他规则形状)而几乎没有偏差的地图,它可能会被击败。

高度不规则地图的一个例子:

x
 x   x
  x x    x
   x     x
    x xxx
     x
    x
   x
  x

几乎没有办法可以将它(空间比和访问时间)有效地安装到常规形状中。另一方面,通过应用基本的几何变换(它是一个缺少小位的平行四边形),非常适合规则形状:

xxxxxx  x
 xxxxxxxxx
  xxxxxxxxx
   xx   xxxx

答案 5 :(得分:1)

最简单的方法是使用数组,只需使用一些特殊标记标记非游戏空间位置。锯齿状阵列也可能有效,但我不会那么用。

答案 6 :(得分:1)

另一个可以让您在O(1)时间内仍然可以访问游戏世界位置并且不会浪费太多空间的选项将是哈希表,其中键将是坐标。

答案 7 :(得分:0)

另一种方法是存储边缘列表 - 沿每条直边的线矢量。以这种方式容易检查包含,并且每个顶点上的四叉树或甚至简单的位置散列可以加速信息的查找。我们用每个边缘的高度分量来模拟棒球场的墙壁并且它工作得非常漂亮。

答案 8 :(得分:0)

这里有一个很大的问题:没有人在这里解决:将它存储在磁盘上并将其存储在内存中的巨大差异。

假设你正在谈论一个游戏 world ,就像你说的那样,这意味着它会变得非常大。你不会将整个东西存储在内存中,而是将存储在附近的内存中,并在玩家四处走动时更新它。

该附近区域应尽可能简单,方便和快捷。它绝对应该是一个数组(或一组在玩家移动时被换出的数组)。它将经常被游戏引擎的许多子系统引用:图形和物理将处理加载模型,绘制它们,使玩家保持在地形,碰撞等顶部;声音将需要知道玩家当前站在什么地面类型,播放适当的脚步声;等等。不是在所有子系统之间广播和复制这些数据,如果你只是将它保存在全局数组中,他们可以随意访问它,速度和效率都是100%。这可以真正简化事情(但要注意全局变量的后果!)。

但是,在磁盘上你绝对想要压缩它。一些给出的答案提供了很好的建议;您可以序列化数据结构,例如哈希表或仅填充位置的列表。你当然可以存储一个八叉树。在任何情况下,您都不希望在磁盘上存储空白位置;根据你的统计数据,这意味着66%的空间被浪费了。当然有时间忘记优化并使其成为Just Work,但您不希望向最终用户分发66%-empty文件。还要记住,磁盘不是完美的随机访问机器(SSD除外);机械硬盘驱动器至少应该在几年左右,并且它们的顺序最佳。看看你是否可以组织你的数据结构,以便读取操作是连续的,因为你在玩家移动时流更多的邻近地形,你可能会发现它是一个显着的差异。不要相信我的话,我实际上没有测试过这种事情,它只是有道理吗?