最适合不可变持久化3D网格的数据结构

10

我正在尝试以函数式编程风格编写游戏,这意味着使用纯函数、不可变的数据结构来表示游戏状态。

其中最重要的数据结构之一将是代表世界的3D网格,其中对象可以存储在任何[x,y,z]网格位置。我想要这个数据结构具备以下属性:

  • 不可变
  • 快速持久更新 - 即创建整个网格的新版本并进行少量更改应该是廉价的,并通过结构共享实现。网格可能很大,因此复制-写入不是可行的选项。
  • 高效处理稀疏区域/相同值 - 空/未填充区域不应消耗任何资源(以允许大型开放空间)。如果它同时能够高效存储大块相同的值,那就更好了。
  • 无限制 - 可以根据需要向任何方向增长
  • 快速读取/查找 - 即可以快速检索[x,y,z]处的对象
  • 快速体积查询,即通过区域[x1,y1,z1]->[x2,y2,z2]进行快速搜索,最好利用稀疏性,以便快速跳过空白空间

您有关于使用哪种最佳数据结构的建议吗?

P.S. 我知道这可能不是编写游戏最实用的方法,我只是把它作为学习经验和扩展函数式编程技能的一种方式......


嗨,我认为值得研究光线追踪器(几乎与查找对象相同的问题)-有很多用FP语言实现的光线追踪器,也许有一个真正重视性能。另一方面,即使在Haskell中也有解决方法,可以获得类似数组的东西来帮助处理这些内容。 - Random Dev
1个回答

1

我建议尝试使用八叉树。每个节点的边界坐标隐含在结构放置中,每个非终端节点保留8个子树但没有数据。因此,您可以通过“联合”来获得空间。

我认为不可变无限制是(通常)相互冲突的要求。
无论如何...要增加八叉树的大小,您必须替换根节点。

您提出的其他要求应该得到满足。


4
所有对函数式数据结构进行修改的操作都会返回新的根节点。因此,在不可变和无界之间实际上不存在冲突。 - Dan D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接