二进制文件&保存游戏格式

时间:2010-01-21 16:51:25

标签: serialization file-format

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

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

编辑:语言是C ++。它看起来像一个可读的格式将是一个更好的镜头。感谢所有快速回复。

4 个答案:

答案 0 :(得分:3)

最简单的解决方案通常是使用库来使用XML或INI编写数据,然后压缩它。这将更容易解析,并导致比自定义二进制格式更小的文件 当然,它们需要稍微加载(虽然不多,除非您的数据文件是100的MB)

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

答案 1 :(得分:2)

您确定需要二进制格式吗?

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

答案 2 :(得分:2)

由于您要保存二进制数据,因此无法使用没有长度的标记。 只需编写任何类型的记录数,然后编写结构化数据,然后就可以了 易于阅读。如果你有像string这样的可变长度元素,那么也需要长度信息。

2
player record
player record
3
entities record
entities record
entities record
1
map

答案 3 :(得分:1)

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

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

(虽然我的个人偏好是文本格式(可选择压缩)或带有长度字节而不是标记的二进制格式。我不明白你是怎么序列化它而不知道你什么时候读完数据结构。 )