我正在为网络开发游戏。这场比赛的地图将至少2000公里乘2000公里。我希望能够以某种粒度级别编码高程和地形类型 - 例如100米X 100米。
对于一个2000公里乘2000公里的地图,在100米 2 中存储这些信息,表示数据库中有20000个20000个元素或总共400,000,000个记录。
是否有其他方式存储此类信息?
更多信息
地图本身不会完整显示。单位将以转弯方式在地图上移动,玩家将获得有关他们所在位置以及当地区域的反馈。地形将决定速度和禁止移动。
我想我想说的是地图将用于游戏而不一定用于图形或显示目的。
答案 0 :(得分:2)
这取决于您想要如何生成地形。 例如,您可以在程序上生成所有内容(使用低分辨率地形/高度贴图的插值 - 存储为两个“位图” - 使用从xy坐标中播种的随机插值来确保地形不会变形),并使用最少的存储空间。 如果您想要完全定义的地形区域,您可以单独存储这些区域并在适当的时候使用它们,随机生成其余区域。)
如果你想要完全定义的地形,那么你需要研究某种压缩/流媒体技术,才能拉出你当前感兴趣的地形。
答案 1 :(得分:1)
我会通过分离地形类型和高程来区别对待它。
我认为,地形类型的变化不会像海拔那样迅速变化 - 可能存在相同类型地形的扇区,其延伸时间比最低粒度级别长得多。我会将这些扇区映射到数据库记录或某种哈希表中,具体取决于性能,内存和其他要求。
我认为高程是半连续的,因为它在大多数情况下会逐渐变化。我会尝试将值映射到一组连续函数(不连续的部分之间的不同集合,如突然的高程变化)。对于地形相同高度或可通过简单函数描述的任何坐标集,您只需定义此函数所涵盖的范围。这应该减少您需要记录的信息量,以描述地形中每个点的高程。
所以基本上我会将地图划分为由(x,y)范围组成的不同扇区,一次用于地形类型,一次用于地形高程,并为每个扇区构建一个哈希表,可以根据需要返回适当的值。
答案 2 :(得分:0)
如果你想要那种你想要的粒度,那就没有明显的方法了。
您可以尝试二维小波变换,但这非常复杂。类似傅里叶变换的东西会做得很好。另外,你可能不会以每片土地一条记录的方式存储地形;拥有某种可以存储编码矩阵的数据库字段更有意义。
答案 3 :(得分:0)
我认为通常的解决方案是将您的域名划分为可管理大小的“磁贴”。你必须在任何给定的时间添加一些逻辑来加载适当的图块,但也不会太糟糕。
您不需要一次访问所有信息 - 即使每个100平方米的存储桶占用屏幕上的单个像素,我知道的屏幕也不会同时显示20k x 20k像素。
另外,我不会使用数据库 - 查看高度映射 - 有效地使用黑色&白色图像,其像素值代表高度。
祝你好运!答案 4 :(得分:0)
无论你采用哪种方式,这将是非常多的信息。 400,000,000个网格单元将造成损失。
我看到了解决这个问题的两种方法。首先,由于它是一个基于网络的游戏,您可能能够获得具有相当大尺寸HDD的服务器,并将400M记录存储在其中,就像您通常那样。或者更有可能创建某种自己的存储机制以提高效率。那么你只需要设计一种有效访问数据的方法,这可以通过考虑到你怀疑需要一次性使用它来实现。 ;)
另一种方式是某种压缩。你必须要小心这一点。大多数开箱即用的压缩算法都不允许您解压缩流中的任意位置。也许你的地形数据中有一些你可以使用的模式?我怀疑它是完全随机的。我更可能预测具有相同数据的大区域。也许那些可以这样编码?