Dfs迷宫生成、优化



我正在努力学习逐一实现所有的迷宫生成算法,我的第一个迷宫生成算法是dfs回溯(非递归(,我已经完成了实现,我已经使用了cpp和sfml。

我通过使用1d矢量和位场对其进行了优化,绘制单元大小为2的9000 x 9000迷宫的最终结果约为1分46秒(直接写入图像no gui(。

这还能改善吗?(我觉得我的图像书写方法很慢。(

遵循代码中的逻辑并不容易。看起来在Maze::checkNeighbours中,您使用xy作为坐标(其中,由于某种原因,x是垂直的(,而在Maze::invalidNeighbour中,x是新的线性偏移,而y是旧的?

无论如何,你可以删除所有的数学,并替换你的条件如下:

  • if(top)->if(x > 0)
  • if(right)->if(y + 1 < cols)
  • if(bottom)->if(x + 1 < rows)
  • if(left)->if(y > 0)由于这个使用了很多时间,你可以节省一些时间

我不确定编译器将如何优化频繁创建的sf::Vector2f及其对另一个sf::Vector2f的分配;即使它们被移动了,你一开始也会浪费时间建造它们。所以,不是:

Quad[counter].position = sf::Vector2f((j*cellSize)+padding, (i*cellSize)+cellSize+padding);

我会做:

Quad[counter].position.x = (j*cellSize)+padding;
Quad[counter].position.y = (i*cellSize)+cellSize+padding;

既然你有十几个,执行了数百万次,我想你会看到一些改进。

然后,您可以在(j*cellSize)(i*cellSize)中避免乘法运算,方法是将它们替换为for语句中的增量,如:

for(int i=0, iScaled=0; i<rows; i++, iScaled += cellSize)
{
for(int j=0, jScaled = 0; j<cols; j++, jScaled += cellSize)

你的编译器可能会这么做,但我认为这会让它更容易阅读。

Quad[counter].position.x = jScaled+padding;
Quad[counter].position.y = iScaled+cellSize+padding;

我也想看看你的turnOnBitturnOffBitcheckBit,因为它们被称为LOT。

至于保存图像,尽管我不知道sfml,但使用SetPixel通常对性能非常不利。看起来有sf::Image::loadFromMemory。你能安排你的迷宫内部表示,这样它就可以被加载了吗?

[CORRECTION]我的微观优化没有太大区别;正如预期的那样,编译器优化处理了这一点。

然而,我运行了一个探查器,注意到大部分时间都花在GL和GDI上。然后我把帧速率从25改为250,性能提高了10倍!可能是window.display();抑制了你的循环吗?如果我将fps更改为2,它会减慢为爬行。。。

最新更新