什么是一种好的平面文件格式,用于存储可以在任何方向无限增长的2D切片地图?


9

我正在创建一个简单的地图引擎,该引擎将根据需要使用过程生成的内容自动向任何方向扩展。

有什么好方法可以存储地图数据,将其锚定在0,0的原点上,以便可以从地图上的任何点快速高效地加载地图数据的矩形子集?

我有一个想法,也许我应该将地图分块为不同的扇区,然后使用某种标头格式来标识特定扇区在文件中的存储位置。这是一项好技术还是我可以看看的更好,更有效的技术?

Answers:


7

我建议不要在理论上将单个平面文件用于无限数量的数据。

如果理论上数据量无限大,则需要随机访问,这意味着多个文件或数据库-或带索引的平面文件格式,这涉及重新解决文件系统或数据库已经解决的索引问题。

如果您将数据块分散到多个文件中,则将数据块的大小设置为(-110,5000)只是说“%APPDATA%/ game / map / -110 / 5000.dat”(或其他文件名)开始压缩它们)。数据库只需要一个查询。如果块中没有任何数据,则无法存储任何数据。单个平面文件无法立即提供随机访问的速度和便利。

在任意大小的单个文件中,要保证快速随机访问,您必须保证任何数据块的位置,这意味着要使用索引(因为对数据块进行原始二进制搜索会损害性能,并在您的数据库中创建网格带有“空白”点的文件会给您Byte56的问题)。一旦开发了索引系统,提高了效率并编写了自己的API,您就可以重新创建文件系统或数据库之类的东西。除非您实际上从中获益,否则可能不值得投资。例如,Steam从其GCF / NCF文件格式中受益匪浅。

如果您想在保存时获得某种安全性,仍然可以这样做。例如,您可以加密每个单独的块。为了防止它们被删除,您可以基于现有保存的数据进行中央哈希处理。如果保存的数据与哈希表不符(并且您的程序没有引起更改),则删除一个块。


4

最常用的解决方案似乎是将文件拆分为多个文件,但是您的问题确实仅意味着一个文件。唯一明智的选择(在我看来)是在单个文件中模拟一个非常简单的文件系统。实际上这并不难,但是如果可以的话,您确实应该考虑使用多个文件。

如果您必须坚持一个文件,那么您可能会从ext2 fs中找到实现的灵感。http://en.wikipedia.org/wiki/Ext2我知道当我必须为游戏实现简单的FS时,它有助于我做出一些明智的决定。

但是,实际上,对于任何增长的地图,通常最好对每个“已访问”的块使用一个文件。


4

当我玩无限世界时,我为自己的游戏实现了分块系统(不确定是否保留它们)。为了与单个文件一起使用,首先,我使用了块的世界位置来计算文件中的字节偏移量。假定块大小为静态,或至少为静态最大值。但是,如果用户朝某个方向前进一段时间,该文件的大小将变得非常稀疏,因为尚未生成大片土地,因此文件中存在空白。

我还尝试了两个文件系统。一个文件包含“块位置”到“块文件偏移”对的映射。第二个保存所有块。当生成一个新的块时,它只是放在块文件的末尾,其偏移量存储在position-> offset文件中。当您有很多块并且在position-> offset文件中找到偏移量时,这是一个问题。如果发现可行,则可以在加载时将position-> offset数据加载到哈希图中,以进行快速访问。

我现在使用第二个选项,但是如果发现性能不足,可能会切换到其他选项。也许有了这些信息,您就可以创建适合您的东西。祝好运!


我建议调查sqlite sqlite.org。它是非常独立的,可索引的,可处理斑点等的。这将有助于提高性能并解决文件中的“漏洞”。
丹尼尔·布雷泽克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.