2

我正在开发一款小型 roguelike 游戏,在创建存档游戏方面需要一些帮助。我尝试了几种保存游戏的方法,但加载总是失败,因为我不确定什么是为玩家、实体和地图标记不同部分的开始的好方法。

什么是标记每个部分的开头的好方法,以便在不知道每个部分的长度的情况下可以可靠地读回数据?

编辑:语言是 C++。看起来可读的格式会更好。感谢所有快速回复。

4

4 回答 4

3

最简单的解决方案通常是使用库使用 XML 或 INI 写入数据,然后对其进行压缩。这将使您更容易解析,并产生比自定义二进制格式更小的文件。
当然,它们的加载时间会稍微长一些(虽然不会很多,除非您的数据文件是 100 的 MB)

如果您决定使用二进制格式,请查看BER

于 2010-01-21T17:00:27.843 回答
2

你真的确定你需要二进制格式吗?

为什么不以某种文本格式存储,以便它可以轻松解析,无论是纯文本、XML 还是 YAML。

于 2010-01-21T16:59:01.280 回答
2

由于您要保存二进制数据,因此您不能使用没有长度的标记。简单地写下任意类型的记录数,然后结构化数据,那么再次读取就很容易了。如果您有可变长度元素(如字符串),则还需要长度信息。

2
player record
player record
3
entities record
entities record
entities record
1
map
于 2010-01-21T17:46:41.663 回答
1

如果您有标记,则必须保证该模式在二进制流中的其他位置不存在。如果确实存在,则必须使用特殊的转义序列来区分它。Telnet 协议使用 0xFF 来标记不属于数据流的特殊命令。每当数据流包含自然出现的 0xFF 时,就必须将其替换为 0xFFFF。

所以你会使用一个 2 字节的标记来开始一个新的部分,比如 0xFF01。如果您的读者看到 0xFF01,这是一个新部分。如果它看到 0xFFFF,您会将其折叠为单个 0xFF。当然,您可以扩展此方法以使用您想要的任何长度标记。

(虽然我个人的偏好是文本格式(可选压缩)或具有长度字节而不是标记的二进制格式。我不明白你是如何在不知道何时完成读取数据结构的情况下对其进行序列化的。)

于 2010-01-21T16:55:41.227 回答