【问题标题】:Chunk Management In A Voxel Based Game基于体素的游戏中的块管理
【发布时间】:2012-07-07 15:21:54
【问题描述】:

我正在开发基于 minecraft 的 java LWJGL 游戏。我正在研究地形管理,这很困难,因为世界可以随着你的探索而扩展。如果地形存储在块对象中,并且您需要知道从渲染列表中删除哪个块、添加哪个块以及根据玩家的 xyz 位置生成哪个块,您将如何管理地形?

【问题讨论】:

  • 它的哪一部分给您带来了问题?事实上,这个问题似乎太宽泛了。
  • 让我难过的部分是如何以一种您可以轻松判断它们是否被渲染的方式存储块,如果您远离它们则将其删除,如果您靠近则添加它们。这很难做到,因为你不能真正将数组用于无限的世界,而且 Arraylist 很难找出索引中的哪个块到哪个 xyz 位置。
  • 我现在想通了才回来......我被难住的原因是我太担心性能了。

标签: java voxel


【解决方案1】:

我使用高分辨率医学体素数据并使用八叉树以有效的方式存储它。

您不能真正使用八叉树,因为您想要动态扩展地形(八叉树在查找时非常快,但在构建/扩展时非常慢)。

我建议你尝试使用 HashMap,如果你为 Vector3 提供了一个好的散列函数,那么对于任何数量的块,查找时间几乎相同(理论上 O(1),但这只是最好的情况...... )。

然后,您可以通过遍历映射键来删除所有看不见的映射条目。(这可以在处理所有加载/卸载的辅助线程上完成)。

希望对你有帮助,

~洛基

【讨论】:

  • 我发现最好的方法是将每个世界部分拆分,这样一个块有一个16x16x16块数组,然后一个区域有一个16x16x16块数组,然后世界可以有一组117188x1x117188 区域,在每个罗盘方向上总共有30000128 块(类似于我的世界)。我正在开发的游戏的数组大小略有不同,但概念是相同的。
  • 当我说数组时,我的意思是Block[][][] blocks = new Block[16][16][16];,而不是哈希图或数组列表;正如我尝试过的那样,它们似乎比传统的 3 维数组慢得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多