2017-07-17 33 views
2

我正尝试在Unity中编写一个无限世界的2D游戏。它应该像Terraria一样,除了每个方向上的“无限”外。所以随着玩家移动,块被生成,存储和加载。我的问题是:块如何存储并随后加载到内存中?我找不到任何有关此主题的教程。我认为这样的大阵列必须存储在光盘上,但不是磁盘IO慢?假设我正在试图在玩家周围加载一个5块大方块(玩家站立的中心块和每个方向的2块)。这是否意味着,如果玩家在两块之间来回移动,我将不得不继续从装载的棋子的每一面加载并存储5块?这不会很慢吗?无限世界如何存储和恢复?

+0

如果加载需要很长时间,那么您可能需要将其分散到多个框架中以防止打嗝。如果您希望玩家来回穿梭,您还可以使用更大的卸载阈值距离。 –

+0

我不知道确切的答案,但我最近一直在想同样的事情,我认为将世界划分为块并将这些块保存到光盘上是最佳选择。当然,当你加载你的世界时,你首先读取存储在光盘上的所有数据 - 所以你不需要这么做(因为正如你所说 - 光盘IO很慢) - 然后加载大块视觉效果给你 – Fiffe

+0

首先确定,如果磁盘IO真的太“太慢”。当然,它比内存访问要慢,但问题是,块中有多少数据,或者更确切地说,必须为块存储多少数据。几千字节甚至都不应该显而易见。如果5个块的“窗口”太小,那么只需保留7或9或装载很多必要的。你需要立即卸载块吗?保存然后卸载可以完全异步完成。玩家转身跑回去了吗?然后停止卸载。玩家在一个方向上运行?你能负担得起加载更多的块吗? – Corak

回答

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,再次,没有大块需要加载或卸载。因此,他可以在没有任何借阅/卸货的情况下在大块之间来回跳动。