2

我正在为网络开发游戏。该游戏的地图将至少为 2000 公里乘以 2000 公里。我希望能够以某种粒度级别对海拔和地形类型进行编码 - 例如 100m X 100m。

对于 2000 公里乘 2000 公里的地图,将此信息存储在 100m 2桶中意味着数据库中有 20000 乘 20000 个元素或总共 400,000,000 条记录。

还有其他存储此类信息的方法吗?

更多信息

地图本身永远不会完整显示。单位将以回合制方式在地图上移动,玩家将获得有关他们所在位置和当地情况的反馈。地形将决定速度和禁止移动。

我想我想说的是地图将用于游戏,不一定用于图形或显示目的。

4

5 回答 5

2

这取决于您要如何生成地形。例如,您可以程序化地生成它(使用低分辨率地形/高度图的插值 - 存储为两个“位图” - 从 xy 坐标播种随机插值以确保地形不会变形),并使用最少的存储. 如果您想要完全定义的地形区域,您可以单独存储它们并在适当的地方使用它们,随机生成其余部分。)

如果您想要完全定义的地形,那么您将需要研究某种压缩/流技术来仅提取您当前感兴趣的地形。

于 2008-11-28T19:38:22.860 回答
1

我会通过区分地形类型和海拔来区别对待它。

  1. 我认为地形类型不会像海拔那样迅速变化——可能有相同类型地形的扇区比最低粒度级别延伸的时间长得多。我会将这些扇区映射到数据库记录或某种哈希表中,具体取决于性能、内存和其他要求。

  2. 我认为海拔是半连续的,因为它在很大程度上是逐渐变化的。我会尝试将这些值映射到一组连续函数(不连续的部分之间的不同集合,如海拔的突然变化)。对于任何地形高度相同或可以用简单函数描述的坐标集,您只需要定义该函数覆盖的范围即可。这应该会大大减少您需要记录来描述地形中每个点的高程的信息量。

所以基本上我会将地图分解为由(x,y)范围组成的不同扇区,一次用于地形类型,一次用于地形高程,并为每个区域构建一个哈希表,可以根据需要返回适当的值。

于 2008-11-28T20:25:11.127 回答
0

如果您想要您正在寻找的那种粒度,那么没有明显的方法可以做到这一点。

您可以尝试二维小波变换,但这非常复杂。像傅里叶变换这样的东西会做得很好。另外,您可能不会以每块土地一条记录的方式存储地形;拥有某种可以存储编码矩阵的数据库字段更有意义。

于 2008-11-28T19:35:28.310 回答
0

我认为通常的解决方案是将您的域分解为可管理大小的“图块”。您必须添加一些逻辑以在任何给定时间加载适当的图块,但还不错。

您不需要一次访问所有这些信息——即使每个 100 平方米的存储桶在屏幕上占用一个像素,我所知道的任何屏幕都不能同时显示 20k x 20k 像素。

此外,我不会使用数据库——查看高度映射——有效地使用像素值表示高度的黑白图像。

祝你好运!

于 2008-11-28T19:39:48.003 回答
0

无论您以哪种方式看待它,这将是非常多的信息。400,000,000 个网格单元将付出代价。

我看到了两种解决方法。首先,由于它是一个基于网络的游戏,你可能能够获得一个具有适当大小的硬盘的服务器,并像往常一样在其中存储 400M 的记录。或者更有可能创建某种您自己的存储机制以提高效率。然后,您只需要设计一种有效访问数据的方法,这可以通过考虑您可能需要一次使用所有数据的事实来完成。;)

另一种方式是某种压缩。不过,您必须小心。大多数开箱即用的压缩算法不允许您解压缩流中的任意位置。也许您的地形数据中有一些您可以使用的模式?我怀疑这将是完全随机的。我更有可能预测具有相同数据的大面积区域。也许那些可以这样编码?

于 2008-11-28T19:40:35.397 回答