【问题标题】:How does minecraft autosaves and keeps proccesing the game at the same time?我的世界如何自动保存并同时继续进行游戏?
【发布时间】:2013-06-25 02:04:15
【问题描述】:

好的,伙计们。我知道您可以使用 ostream 和 istream 读取文件和排序方式(至少在 C++ 中)。我的问题是游戏 >Minecraft

【问题讨论】:

  • 我猜整个世界都是一个蒙特卡罗模拟,有一个噪声函数生成世界/内容,你只需要在这种情况下拍摄该函数的快照。
  • @arynaq - 这基本上是世界初始状态的生成方式,但玩家会做一些事情来改变世界(采矿、建筑、杀牛、采花……)等等开启,并且需要保存该状态。

标签: java c++ iostream save


【解决方案1】:

我不知道 Minecraft 具体是如何做到的,但您可以通过多种方式实时获得一致的快照。例如。

  • 如果 mutator 在快照期间尝试更改数据结构的相关部分,则数据结构可能会创建卷影副本。

  • 可以锁定所有节点,以防止在进行快照时修改器更改它们。如果 mutator 试图获取一个节点上的锁,这可能会导致快照进程将节点移动到队列的前面......这样 mutator 只会被阻塞一小段时间。

  • 他们可能只是将快照创建过程实现为增量,并且典型的增量可能足够快,以至于用户通常不会注意到 mutator 暂停了一小段时间。 (我的猜测是,任何小于 1/10 秒的时间都不会引起注意……除非它会产生明显的“视觉伪影”。即便如此,Minecraft 的渲染质量还是让用户可能不会过度担心。至少,这是我从观看其他人的比赛中观察到的……)


但有一件事是肯定的。该实现很可能是 Minecraft 特定的并且是手动调整的。没有通用的 Java 库类可以神奇地做这种事情。我怀疑他们是否使用 IOStreams 的 Java 等价物来做到这一点。

【讨论】:

    【解决方案2】:

    我不具体了解 Minecraft 或 Java,但通常的方法是使用内存映射文件:

    • 程序要求操作系统将文件映射到内存中。在 C 中,相关函数是 mmap(在 Unix 上)和 CreateFileMapping(Windows)。
    • 程序现在有一块内存,它可以访问就好像文件已完全读入内存,即使它不是。操作系统会根据需要从磁盘上的文件中加载相关数据。
    • 程序对内存块所做的任何更改都将写入磁盘。操作系统通常会缓存这些更改,并且仅在缓存已满或磁盘或 CPU 空闲时才将它们写入磁盘。

    【讨论】:

    • 天啊!!谢谢。 “CreateFileMapping”正是我想要的。它将文件保存在虚拟内存中,然后您可以直接读取和写入文件。
    猜你喜欢
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多