Java 优化康威生活游戏

Java 优化康威生活游戏,java,performance,data-structures,Java,Performance,Data Structures,我正忙于编码,我正试图使用一些数据结构来优化它,这些数据结构记录了在每个生命周期中应该检查哪些细胞 我使用arrayList作为动态数据结构来记录所有活细胞及其邻居。是否有更好的数据结构或方法来缩短列表,从而提高游戏速度 我这样问是因为很多单元格经常被检查,但没有更改,所以我觉得我的实现可以得到改进。我相信这会对您有所帮助 它给出了使用树数据结构(其中每个内部节点正好有四个子节点)来保存数据的想法,然后使用哈希表来存储四叉树的节点 埃里克·伯内特(Eric Burnett)撰写的《进一步阅读》对

我正忙于编码,我正试图使用一些数据结构来优化它,这些数据结构记录了在每个生命周期中应该检查哪些细胞

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

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

我相信这会对您有所帮助

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


埃里克·伯内特(Eric Burnett)撰写的《进一步阅读》对Hashlife的工作原理、性能和实现(尽管是Python)有着深刻的见解。值得一读。

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

它的基本诀窍是将问题视为根据生活规则计算“此单元所在”的布尔逻辑公式,而不是像往常一样计算活动邻居。这个公式很容易算出,所以留作家庭作业练习。使它快速的是,布尔公式是按位计算的,一次计算8位。如果你在屏幕上横扫几行,你基本上可以一次计算N位(6800上为8位,现代PC上为64位),开销非常低。如果您发疯了,您可能会使用SIMD向量扩展,“一次”执行256位或更多。最重要的是要用GPU来实现这一点

6800版本将在大约0.5秒内处理一个完整的屏幕;你可以看到更新从上到下在屏幕上波动(60赫兹刷新)。在一个时钟频率为1000倍(1GHz非常容易获得)且一次64位的现代CPU上,它应该能够每秒产生数千帧。速度如此之快,以至于你无法看到它运行:-{

一个有用的观察结果是,生命世界的大部分是死的(空白),处理这部分会产生更多的死细胞。这建议使用稀疏表示。另一张海报建议使用四叉树,我认为这是一个非常好的建议。你的四叉树区域也不必是正方形


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

对于不熟悉的人,添加一个“康威生命游戏”的链接可能会有帮助,或者至少有意思。几年前我见过一个LinkedList的实现,速度非常快,但不幸的是,我没有关于它的详细信息。它出现在Sam的一本老编程书中。我认为带有4个指向其他节点的指针的节点可以非常快,无论你做什么。超越大多数人所做的,这就是盲目地尝试,并抱着最好的希望。你可以使用一个位集来标记活细胞,这将允许你一次跳过64个非活动细胞。你可以向你的细胞添加正向和反向链接,避免辅助列表的开销。你可以使用Hashlife的思想,而忘记低级优化。你为什么需要hashtables存储树叶?四叉树可以实现为“树”非常漂亮,不需要散列。@IraBaxter在散列表中进行迭代比在树中进行迭代更容易。这太有趣了,我真的想到了同样的事情!我没有意识到它有一个实际的数据结构和算法。@progenhard:没有。重点是你可以缓存整个子树的结果,这是一个巨大的收获。我认为一个quadkey和怪兽曲线速度更快,而且空间质量也很好。@Ira Baxter:不,这些数字来自,并且(某种程度上)反驳了你所说的。这里有一个很好的解释,说明了它是如何工作的。