优化康威的生活游戏

时间:2013-09-13 19:26:33

标签: java performance data-structures

我正在忙于编码Conways Game of Life,我正在尝试使用一些数据结构来优化它,该数据结构记录每个生命周期应检查哪些单元格。

我使用arrayList作为动态数据结构来记录所有活细胞及其邻居。是否有更好的数据结构或保持较短列表的方式,以提高游戏速度?

我问这个是因为经常检查很多单元格但没有更改,所以我觉得我的实现可以改进。

2 个答案:

答案 0 :(得分:3)

我相信Hashlife algorithm可以帮到你。

它给出了使用quadtree(树数据结构,其中每个内部节点恰好有四个子节点)来保存数据的想法,然后它使用哈希表来存储四叉树的节点。

为了进一步阅读,由Eric Burnett撰写的this post提供了关于 Hashlife 如何工作,它的性能和实现(尽管在Python中)的深刻见解。值得一读。

答案 1 :(得分:2)

我使用2Mhz 6800 8位计算机构建了一个Life引擎,该引擎在20世纪70年代直接映射到屏幕像素的256x512位网格上运行。我直接在显示器像素上做了它们(它们是一位开/关白/黑),因为我想看结果并没有看到将Life图像复制到显示器的重点。

它的基本诀窍是将问题视为根据生活规则评估“此细胞开启”的布尔逻辑公式,而不是像往常一样计算活着的邻居。这个公式很容易搞清楚,所以留作家庭作业。使它快速的原因是布尔公式是按位计算的,一次做8位。如果您扫描屏幕并跨越行,您实际上可以一次评估N位(6800上为8位,现代PC上为64位),开销非常低。如果你疯了,你可以使用SIMD向量扩展,并在“一次”做256位或更多。顶部将使用GPU进行此操作。

6800版本将在大约0.5秒内处理完整的屏幕;您可以从上到下观看屏幕下方的更新(60 Hz刷新)。在具有1000倍时钟速率(1 GHz非常容易获得)和64位的现代CPU上,它应该能够每秒产生数千帧。如此之快,你无法观看它: - {

一个有用的观察结果是生命世界的大部分已经死亡(空白)并且处理该部分主要产生更多的死细胞。这表明使用稀疏表示。另一张海报提出了四面体,我认为这是一个非常好的建议。您的四叉树区域也不必是正方形。

结合这两个想法,非空白区域的四叉树以及由四叉树指定的位块的位级处理可能会给出一个惊人的快速生命算法。