我正在考虑为每个x,y,z坐标设置一个3x3矩阵。但这会浪费内存,因为很多块空间都是空的。另一种解决方案是使用散列映射((x,y,z) - > BlockObject),但这似乎也不太有效。
当我说有效时,我并不意味着最佳。它只是意味着它足以在您的现代计算机上顺利运行。请记住,我的世界所产生的世界是巨大的,无论如何效率都很重要。还有大量需要存储的元数据。
答案 0 :(得分:2)
正如我在评论中所指出的,我不知道MineCraft是如何做到这一点的,但是代表这种数据的一种常见有效方式是八叉树; http://en.wikipedia.org/wiki/Octree。一般的想法是,它就像一个二叉树,但在三个空间。您递归地划分每个维度中的每个空间块以获得8个较小的块,每个块包含指向较小块的指针和指向其父块的指针。
这使您可以高效地存储相同材质的大块(例如,“空白空间”),因为只要到达由相同的东西组成的块,就可以终止递归,即使你没有递归到单个“立方体”单位的水平。
此外,这意味着您可以通过获取当前块并上升到足够远的树到达包含您可以看到的所有块的块来有效地找到给定区域中的所有立方体 - 这样,您可以很容易地忽略其他地方的所有立方体。
答案 1 :(得分:1)
如果您有兴趣探索替代意味着代表Minecraft世界(块)数据,您还可以查看位串的概念。每个“块”由一个16 * 16 * 128的卷组成,而16 * 16可以用单个字节字符充分表示,并且可以合并为二进制字符串。
由于这种方法非常特定于交易客户端计算与高度优化的存储和传输时间的某个目标,因此尝试解释所有细节似乎是不明智的,但是我已经为此目的创建了一个规范,如果你感兴趣。
使用这种方法,计算存储成本与当前每块1字节有很大不同,而是“可变比特率”:((每块1位,四舍五入为8的倍数)* (块类型出现在块中的唯一层数+ 2字节)
然后将(对于该块中的唯一块类型数)求和。
几乎只在故意边缘的情况下,这比正常结构的块更昂贵,超过99%的Minecraft块自然生成并且将受益于这种可变位表示在我的许多测试中,比例为8:1或更高。
答案 2 :(得分:0)
你最好的选择是反编译Minecraft并查看源代码。 Modifying Minecraft: The Source Code是如何做到这一点的一个很好的演练。
答案 3 :(得分:-1)
Minecraft离效率很远。它只存储数据的“块”。
在Minecraft Wiki上查看Development Resources中的“地图格式”。 AFAIK,内部表示完全相同。