【问题标题】:Serialization in component based game engine基于组件的游戏引擎中的序列化
【发布时间】:2015-04-30 06:46:39
【问题描述】:

我正在基于组件的游戏引擎中实现序列化,以便在我的游戏中保存和加载。我正在使用 Cereal 来帮助我进行序列化。但是,有两件事我不清楚:

  • 我有很多组件,而且这些组件还包含类等。我需要为它们都编写序列化函数吗?这意味着我必须编写大约 100 个序列化函数。它们中的大多数都是相同的(只需序列化所有成员变量)。有没有办法减少工作量?

  • 如果我想序列化包含来自另一个代码库的类的类,该怎么办?例如,我正在使用 SDL 和 TinyXml。这是否意味着我必须在这些代码库中编写序列化函数?

我希望我可以避免添加所有这些序列化函数的繁重工作。

【问题讨论】:

    标签: c++ serialization components game-engine


    【解决方案1】:

    不幸的是,没有魔法。无论您使用什么序列化库,无论是boost::serializations11n 还是MFC,问题是您总是必须为每个单独的类声明如何对其自身进行序列化。

    这是由于类成员上没有可用的元数据这一事实所固有的,这可以允许根据其成员的类型自动序列化复杂类。

    解决这个问题的唯一方法是采用专门设计的类来解决动态自引用问题。但这可能会以性能为代价,或者在构建而不是归档方面产生开销。 Arpproaches 可以是以下几种的组合:

    • 归档感知基类。
    • map 或属性容器,而不是本地硬编码变量。
    • 最终为每个可序列化成员使用自存档基类型,并在构造对象时将它们注册到一种存档工作列表中。

    另一种方法是设计一个可以在您的标头上运行的代码生成器,并自动生成序列化代码。但这本身已经是一个雄心勃勃的项目。

    最后一个想法:所有这些手动归档代码肯定是开销。但是,它允许您处理对象结构的演变,例如,如果您的代码的较新版本添加或删除了一些成员,并且必须反序列化使用旧版本编写的文件。这是通过自动化方法无法轻松实现的。

    【讨论】:

    • 谢谢!我想我只需要完成繁重的工作。您对从未编写的代码库中序列化类有何看法?
    • 好吧,序列化肯定不是这个世界上最令人兴奋的任务之一。另一方面,它迫使我们思考每个对象,定义其内在状态的因素,它与其他对象的关系,以及不值得存储的“瞬态”数据。所以它迫使你对这些外国代码库及其架构有一定的了解。
    猜你喜欢
    • 2010-12-26
    • 2012-01-14
    • 2017-07-27
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多