【问题标题】:Storing unpicklabe pygame.Surface objects in external files将 unpicklabe pygame.Surface 对象存储在外部文件中
【发布时间】:2011-07-05 23:08:14
【问题描述】:

所以我遇到了一个问题 - 我正在使用 Pygame 用 Python 编写游戏原型,并且我想保存我的游戏。所有与游戏相关的数据都在某些类的三个实例中,我想将这三个实例保存到一个文件中。但是,我尝试过酸洗这些实例,但它不起作用。相反,我得到“TypeError: can't pickle Surface objects”。这是个问题,因为我要存储 Surface 对象。

我愿意接受使用任何其他类型的数据类型来替代可能存在的酸洗。重要的是这些实例被存储起来,并且它们的数据可以在以后检索。那么我能做些什么来克服这个问题呢?请记住,我不是一个经验丰富的程序员,一年前在业余时间学习了 Python,虽然我正在慢慢学习 C++,但我不会写太多其他语言。

【问题讨论】:

    标签: python serialization pygame pickle


    【解决方案1】:

    阅读http://docs.python.org/library/pickle.html#pickle-protocol,您需要让 Surface 对象导出 reduce 方法,或者使用 copy_reg 模块告诉 pickle 如何处理 http://docs.python.org/library/copy_reg.html#module-copy_reg 中记录的数据。

    无论哪种方式,pickle 都需要一个函数,它将无法处理的 blob 转换为 (some_class, [arguments here])。然后当你 unpickle 时,它​​将使用这些参数构造该类的新事物。

    【讨论】:

      【解决方案2】:

      酸洗的基本要点是您应该能够以某种方式序列化对象。 SDL 表面是一个在内存中的对象,它拥有很多运行时状态。尝试将其序列化并不完全明智。

      您应该做的是将游戏的状态与渲染组件分离,以便您可以仅序列化那些(酸洗或其他)。

      这就像试图通过某种方式保存保存已解码视频的内存缓冲区来保存视频的状态。这行不通。相反,您如何保存它是序列化视频文件的位置和时间偏移。然后,您可以在下次恢复应用程序时在加载时继续播放。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-30
        • 1970-01-01
        • 2011-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        相关资源
        最近更新 更多