【问题标题】:Loading tiles for a 2D game为 2D 游戏加载图块
【发布时间】:2010-07-30 18:16:33
【问题描述】:

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

最近我考虑将所有图块存储在单独的文件中,每个图块一个文件。我不确定这是否是一个好主意(不知何故感觉不对),但这意味着我不必在文本文件中将任何不必要的图块存储为“-1”,我可以选择在运行时轻松地从文件夹中找到正确的图块(读取名为 mapXYZ 的文件)。如果磁贴是空的,我将能够捕获 FileNotFoundException。谁能告诉我这是一个不好的解决方案的原因吗?我考虑过的其他解决方案是将地图拆分成更小的部分,或者在启动时在 BackgroundWorker 中读取地图。

【问题讨论】:

    标签: file map


    【解决方案1】:

    首先尝试以与当前格式相同的格式制作更大的地图 - 这可能是 200 毫秒主要只是文件打开和初始处理的开销。

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

    • 打开这么多文件会产生大量开销。
    • 捕获 FileNotFoundException 并吃掉它会明显变慢 - 捕获异常实际上有很多开销,因此您不应该依赖它们来执行应用程序逻辑。

    【讨论】:

    • 好的,谢谢:) 我会制作一张更大的地图,然后尝试将其加载到后台工作人员中
    • 我认为打开一个小文件需要 200 毫秒的开销。我怀疑文件是远程的...
    • 对不起,我看到它实际上是 (50, 50, 30)。
    【解决方案2】:

    您是从远程服务器加载文件吗?如果是这样,这就是为什么它需要这么长时间。相反,您应该将文件嵌入到游戏中。我这样说是因为您可能每个图块占用 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's, 1, 1, 2, 3, 12 0's, 1}

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


    示例二进制格式

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

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

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

    • 其余的段都表示磁贴编号,长度为 3 个字节,MSB 为 0。以下是例外。

    • 如果其中一个 tile 段是空 tile,它的长度为 4 个字节,MSB 为 1,并表示包括该 tile 在内的空 tile 的数量。

    我建议使用 MSB 标志的原因是,您可以区分用于图块的段和指示该段后面的空图块数量的段。对于这些段,我将长度增加到 4 个字节(您可能希望将其设为 5),以便您可以在每个段中存储更多的空图块。

    【讨论】:

    • 不,地图文件存储在本地。 @ 1) 谢谢:) 这可能会使阅读速度更快并占用更少的空间,因为 Z 中的许多立面/楼层几乎完全是空的。 @ 2) 我之前尝试使用二进制写入器,但最终得到了两倍大的文件,但也许我做错了什么。
    • @Alle:没问题。如果游戏是在线的(例如flash/java 游戏),你如何在本地存储地图文件?还是整个游戏都存储在本地,只是一个多人游戏?关于二进制 - 如果你做得对,它肯定会减少文件大小。首先,您认为拥有多达 4095 个(=3 字节)不同的图块就足够了吗?如果是这样,我会用更详细的二进制格式建议来编辑我的答案:)
    • 哦,我注意到我写错了,我加载的文件实际上是 50,50,30 而不是 20,20,30
    • 哦,是的,我可能不需要超过几百个。图形地图存储在客户端中。玩家从服务器获得的关于地图的唯一信息是他周围的瓷砖是否是实心的。
    • 另一种选择是不存储每个瓦片的数据,无论它是否为空,只需存储瓦片的位置并逐步处理它们。我猜在 50x50x30 网格 + 加载时间很慢的情况下,我们有嵌套循环加载图块;无法很好扩展的 O(n^3) 加载时间。
    猜你喜欢
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 2018-01-07
    相关资源
    最近更新 更多