加载2D游戏的图块

时间:2010-07-30 18:16:33

标签: file map

我正在尝试制作2D在线游戏(带有Z位置),目前正在处理从txt文件加载地图。我有三个不同的地图文件。一个包含每个瓷砖的int,说明有什么样的地板,一个说什么样的装饰,一个说什么可能覆盖瓷砖。问题是当前地图(20,20,30)需要200毫秒才能加载,我希望它要大得多。我试图找到一个很好的解决方案,到目前为止已经提出了一些想法。

最近我考虑将所有图块存储在单独的文件中,每个图块一个文件。我不确定这是不是一个好主意(在某种程度上感觉不对),但这意味着我不必将任何不需要的磁贴存储为文本文件中的“-1”,我就可以选择在运行时很容易从文件夹中找到正确的磁贴(读取名为mapXYZ的文件)。如果tile是空的,我只能捕获FileNotFoundException。谁能告诉我这是一个糟糕的解决方案的原因?我想到的其他解决方案是将地图拆分成较小的部分或在启动时在BackgroundWorker中读取地图。

2 个答案:

答案 0 :(得分:1)

尝试使用与当前格式相同的格式制作更大的地图 - 可能是200ms主要是打开和初始处理文件的开销。

如果我理解您提出的解决方案(在每个X,Y或X,Y,Z坐标的单个地图上打开一个文件),这有两个原因:

  • 打开这么多文件会有很大的开销。
  • 捕获FileNotFoundException并使用它会明显变慢 - 捕获异常实际上有很多开销,所以你不应该依赖它们来执行应用程序逻辑。

答案 1 :(得分:1)

您是从远程服务器加载文件的吗?如果是这样,那就是为什么这么长时间。相反,你应该将文件嵌入到游戏中。我这样说是因为你可能每块瓷砖需要2-3个字节,所以文件大约30kb和200ms听起来像是一个合理的文件大小的下载时间(包括开销等,取决于你的互联网连接)。

关于如何降低文件大小 - 我可以想到两种简单的技术可以减少文件大小:

1)如果你有大多数空方块而只有一些重要方块,你的地图通常被称为“稀疏”。存储稀疏数据数据时,您可以使用简单的压缩技术(正式名称为“游程编码”),每次进入空方块时,您可以指定它们中有多少。例如,而不是{0,0,0,0,0,0,0,0,0,0,1,1,2,3,0,0,0,0,0,0,0,0, 0,0,0,0,1}你可以存储{10 0,1,1,2,3,12 0,1}

2)为节省空间,我建议您将所有内容存储为二进制数据。文件的确切设置主要取决于有多少可能的tile类型,但这比存储与numers的base-10表示相对应的ascii字符更好,解决方法用分隔符分隔。


示例二进制格式

  • 文件被组织成3或4个字节长的段,如下所述。

  • 第一段表示为其创建地图的游戏版本。 3个字节长。

  • 段2,3和4表示地图的尺寸​​(x,y,z)。每个3个字节。

  • 其余的段都指示一个瓦片编号,长度为3个字节,MSB为0.以下是例外情况。

  • 如果其中一个图块片段是空图块,则其长度为4个字节,MSB为1,并指示包含该图块的空图块数。

我建议使用MSB标志的原因是,您可以区分用于切片的线段,以及指示跟随该线段的空切片数量的线段。对于这些段,我将长度增加到4个字节(您可能希望将其设置为5),这样您就可以为每个段存储更多的空块。