Minecraft如何自动保存并同时处理游戏?

时间:2013-06-25 02:04:15

标签: java c++ iostream save

好的伙计们。我知道你可以使用ostream和istream来读取文件和排序(至少在C ++中)。我的问题是游戏> Minecraft<能够生成块(游戏世界),保存它们并在需要时加载它们,同时玩家与游戏进行交互。通过互动我的意思是建筑,采矿,走路,死亡(经常安静)。 这一切怎么可能?你怎么能修改每2秒保存一次的日期?我应该打开一个流而不是关闭它,还是有一个特殊的功能或方法来做到这一点? 谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

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

  • 他们可能只是简单地将快照创建过程实现为增量,并且典型的增量可以足够快,以至于用户通常不会注意到mutator在短时间内暂停。 (我的猜测是,任何不到1/10秒的东西都会变得不明显......除非它产生一个明显的“视觉神器”。即使这样,Minecraft的渲染质量也是如此,用户可能不会过分担心。至少,这是我观察其他人玩的观察......)


但有一件事是肯定的。实施可能非常具有Minecraft特性和手动调整。没有通用的Java库类可以神奇地做这种事情。我怀疑他们是否正在使用IOStreams的Java等价物。

答案 1 :(得分:0)

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

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