Data structures 什么是标准的数据结构,可以用来有效地代表世界的地雷?

Data structures 什么是标准的数据结构,可以用来有效地代表世界的地雷?,data-structures,minecraft,Data Structures,Minecraft,我在想x,y,z坐标的3x3矩阵。但这将是对内存的浪费,因为很多块空间都是空的。另一个解决方案是使用hashmap((x,y,z)->BlockObject),但这似乎也不太有效 当我说有效时,我不是指最优。这仅仅意味着它足以在现代计算机上平稳运行。请记住,雷击机产生的世界是相当巨大的,效率是重要的。还有大量的元数据需要存储。你最好的办法是反编译Minecraft并查看源代码。这是一个很好的关于如何做到这一点的演练。正如我在评论中提到的,我不知道MineCraft是如何做到这一点的,但表示这类数

我在想x,y,z坐标的3x3矩阵。但这将是对内存的浪费,因为很多块空间都是空的。另一个解决方案是使用hashmap((x,y,z)->BlockObject),但这似乎也不太有效


当我说有效时,我不是指最优。这仅仅意味着它足以在现代计算机上平稳运行。请记住,雷击机产生的世界是相当巨大的,效率是重要的。还有大量的元数据需要存储。

你最好的办法是反编译Minecraft并查看源代码。这是一个很好的关于如何做到这一点的演练。

正如我在评论中提到的,我不知道MineCraft是如何做到这一点的,但表示这类数据的一种常用有效方法是八叉树。一般的想法是,它就像一棵二叉树,但在三个空间中。递归地划分每个维度中的每个空间块,得到八个较小的块,每个块包含指向较小块的指针和指向其父块的指针

这使您能够高效地存储相同材质的大块(例如,“空空间”),因为您可以在到达由所有相同内容组成的块时终止递归,即使您没有递归到单个“立方体”单元的级别


同样,这意味着你可以通过把你当前的区块放到树上足够远的地方,找到一个包含你所能看到的所有区块,从而有效地找到给定区域中的所有立方体。这样,你就可以很容易地忽略其他地方的所有立方体。

Minecraft远远没有效率。它只存储“块”数据


查看at Minecraft Wiki中的“地图格式”。好吧,内部表示法完全相同。

如果您有兴趣探索表示Minecraft world(区块)数据的替代方法,您还可以研究位字符串的概念。每个“块”由一个16*16*128卷组成,而16*16可以用一个单字节字符表示,并可以合并成一个二进制字符串

由于这种方法对于交易客户机计算与高度优化的存储和传输时间的特定目标非常具体,因此试图解释所有细节似乎是不明智的,但如果您感兴趣,我已经为此创建了一个规范

使用此方法,计算存储成本与当前的每块1字节大不相同,而是“可变比特率”:(每块1比特,四舍五入为8的倍数)*(块类型在块中显示的唯一层数)+2字节)

然后为(该块中块类型的唯一数量)求和


几乎只有在深思熟虑的EdgeCase中,这可能比正常结构的块更昂贵,超过99%的Minecraft块是自然生成的,并且在我的许多测试中,会以8:1或更高的比率从这种可变位表示中受益。

是什么让这“不是一个真正的问题”?这很可能属于所有这些stackoverflow衍生产品,它们正开始成为a**的一大难题。每天都会有一个新的问题。要求将此问题转移到相应的stackexchange站点。使此问题“不是真正的问题”的一个原因是,您提出了两个独立的问题,而不仅仅是一个问题。(除此之外,“minecraft如何有效地呈现世界?”是一个模糊的问题,需要一篇文章来合理地回答。)另一个使它不是真正的“编程”问题的原因是它非常局限于一个特定的封闭源代码程序,我们很少有人能够访问该程序,因此不太可能得到真正的答案。问“存储这类数据的标准数据结构是什么?”是一个更容易回答的问题。