C# 如何存储和恢复无限世界?

C# 如何存储和恢复无限世界?,c#,unity3d,io,procedural-generation,C#,Unity3d,Io,Procedural Generation,我想写一个2D游戏,在一个统一的无限世界里。它应该像Terraria一样,除了各个方向的“无限”。因此,当玩家移动时,块会在移动中生成、存储和加载。我的问题是:块是如何存储并随后加载到内存中的?我找不到任何与此主题相关的教程。我假设这样大的阵列必须存储在磁盘上,但磁盘IO不是很慢吗?假设我试着在玩家周围加载一个由5块组成的大正方形(玩家站立的中心块和每个方向的2块)。这是否意味着,如果玩家继续在两个块之间来回移动,我必须继续加载并存储加载块每侧的5个块?这不是很慢吗?如果玩家在2个区块之外,你可

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

如果玩家在2个区块之外,你可以加载区块,但除非玩家在4个区块之外,否则不要卸载区块

假设玩家正在向右行走:(这里
X
是玩家,
abc..
是块,在
[]
中是加载半径内的加载块,在
()
中是卸载半径内的加载块)

如果他决定返回chunk
g
,则chunk
e
不需要加载(已经加载),chunk
j
不需要卸载(不在卸载半径之外)


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

如果加载需要很长时间,则您可能希望将其分散到多个帧上,以防止打嗝。如果你希望玩家经常来回,你也可以使用更大的卸载阈值距离。我不知道确切的答案,但我最近一直在想同样的事情,我认为将一个世界划分成块并将这些块保存到光盘上是最好的选择。当然,当你加载你的世界时,你首先读取存储在光盘上的所有数据——因此你不需要在运行中读取数据(因为正如你所说,光盘IO非常慢)——然后加载离你很近的区块视频,首先确定磁盘IO是否真的“太”慢。当然,它比内存访问慢,但问题是,一个块中有多少数据,或者更准确地说,一个块必须存储多少数据。几千字节甚至不应该被注意到。如果5个块的“窗口”太小,那么只需保持7个或9个块,或者不管需要加载多少块。是否需要立即卸载块?保存和卸载可以完全异步完成。球员是否转身跑回?然后停止卸货。玩家朝一个方向跑?这样你能负担得起加载更多的块吗?最重要的是:首先让它工作,然后让它快速。某种程度的优化可以而且应该提前完成,但除此之外,只有在出现实际性能问题时才进行优化。回复:传送:别担心。玩家天生就明白硬件的局限性,只要暴徒不能在他们周围的世界加载之前攻击并杀死他们,他们就不会在意虚空视图。
a b c (d) (e) [f] [g] [X] [i] [j] k l
a b c (d) [e] [f] [X] [h] [i] (j) k l