Unity3D - 我应该存储重播的文件格式



>我在Unity3D中制作了一个状态保存回放系统,我希望将回放写入文件。保存重播时最好使用哪种文件格式?也许是XML?现在,我正在存储转换数据,并且已经实现了添加其他帧数据的选项。

这在很大程度上取决于你要做什么。在这种情况下,每个解决方案都有权衡。

根据您在评论中提供的额外信息,在这种情况下,我能想到的最佳解决方案是将您的个人"录制会话"编接到一个文件中。但是,为了实现这一点,需要做一些开销。

  1. 创建一个名为Frame的类,创建另一个名为Record的类,该类具有List<Frame> frames。这样,您可以将每个帧中要捕获的任何信息作为属性放置在Frame类中。
  2. 由于无法封送泛型类型,因此必须单独封送每个帧。我建议在Record类中实现一个名为MarshalRecording()的方法,为您处理它。
  3. 但是,在这样做时,您会发现很难取消封送记录,因为它们可能具有二进制形式的不同大小,并且它们没有指示帧结束位置和下一帧开始位置的分隔符。我建议在每个编组帧的开头附加大小信息,这样您就可以取消编组所有帧,即使它们具有不同的大小。

正如@PiotrK在他的回答中指出的那样,你可以使用protobuf。但是,我不建议您将其用于您的特定用途。就个人而言,我认为这是矫枉过正(工作量太大,结果太少,protobufs 有时可能是 PITA(。

如果您担心存储大小,则可以将整个内容(如果您正在连接内存中的二进制信息(或LZ4每个帧(如果您单独处理每个帧然后将其附加到文件中(。我推荐后者,因为根据帧的数量,在封送记录时可能会耗尽内存。

Ps:永远不要使用XML,这是癌症!

我知道的最好的方法是使用某种格式生成器(如Google Protobuf(。与使用默认 C# 序列化程序相比,这有几个优点:

  1. 格式的版本控制尽可能简单;您可以向格式添加新功能,这不会破坏字段中已经存在的重播
  2. 结果存储为文本或二进制,二进制有利且占用空间非常小(例如,如果您的某些数据具有默认值,则它根本不会出现在输出中 - 加载器将优雅地处理它们(
  3. 这是谷歌技术! :-(

最新更新