0

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

4

2 回答 2

1

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

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

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

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


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

于 2013-06-25T02:39:07.473 回答
0

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

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