【问题标题】:How are infinite worlds stored and restored?无限的世界是如何存储和恢复的?
【发布时间】:2017-07-17 06:46:58
【问题描述】:

我正在尝试在 Unity 中编写一个具有无限世界的 2D 游戏。它应该像泰拉瑞亚一样,除了在各个方向上都“无限”。因此,随着玩家的移动,块会在旅途中生成、存储和加载。我的问题是:如何存储块并稍后将其加载到内存中?我找不到与此主题相关的任何教程。我假设这么大的阵列必须存储在磁盘上,但是磁盘 IO 不是很慢吗?假设我试图在玩家周围加载一个由 5 个块组成的大正方形(玩家站立的中心块和每个方向的 2 个块)。这是否意味着,如果玩家继续在两个块之间来回移动,我将不得不从该加载块的每一侧继续加载和存储 5 个块?那会不会很慢?

【问题讨论】:

  • 如果加载需要很长时间,那么您可能希望将其分散到多个帧中以防止打嗝。如果您希望玩家来回走动很多,您也可以使用更大的卸载阈值距离。
  • 我不知道确切的答案,但我最近一直在想同样的事情,我认为将世界分成块并将这些块保存到磁盘上是最好的选择。当然,当您加载您的世界时,您首先读取存储在磁盘上的所有数据 - 所以您不需要即时执行此操作(因为正如您所说 - 磁盘 IO 非常慢) - 然后加载接近的块视觉效果给你
  • 首先判断磁盘IO是否真的“太”慢了。当然它比内存访问慢,但问题是,一个块中有多少数据,或者更准确地说,一个块必须存储多少数据。几千字节甚至不应该引起注意。如果 5 个块的“窗口”太小,那么只需保持 7 或 9 个或许多必要的加载。你需要立即卸载一个块吗?保存然后卸载可以完全异步完成。玩家会转身跑回去吗?然后停止卸载。玩家朝一个方向跑?你能负担得起以这种方式加载更多的块吗?
  • 最重要的是:首先让它工作,然后让它快速。 一些级别的优化可以而且应该事先进行,但除此之外,只有在存在实际性能问题时才进行优化。
  • Re: 传送:别担心。玩家天生就知道存在硬件限制,只要怪物无法在世界真正加载到他们周围之前攻击并杀死他们,他们就不会关心虚空视图。

标签: c# unity3d io procedural-generation


【解决方案1】:

如果玩家在 2 个区块之外,您可以做的是加载区块,但除非玩家在 4 个区块之外,否则不要卸载它们。

假设玩家向右走:(这里X是玩家,a b c..是块,[]是加载半径中的块,()是加载的块卸载半径)

a b c (d) (e) [f] [g] [X] [i] [j] k l

如果他决定返回块 g,则块 e 不需要加载(它已经是)并且块 j 不会被卸载(它不在卸载半径之外) .

a b c (d) [e] [f] [X] [h] [i] (j) k l

如果他想回到块h,同样,不需要加载或卸载块。所以他可以在块之间来回跳跃而无需任何加载/卸载。

【讨论】:

    猜你喜欢
    • 2013-04-06
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多