DFS迷宫生成,优化?

时间:2020-09-04 18:40:18

标签: c++ depth-first-search maze

我正在尝试学习一个一个地实现所有迷宫生成算法,我的第一个迷宫生成算法是dfs回溯(非递归),我已经实现了,我已经使用了cpp和sfml。 / p>

我通过使用1d向量和位字段对其进行了优化,最终渲染出2个像元大小为9000 x 9000的迷宫的最终结果大约是1分钟46秒(直接写入没有GUI的图像)。

这还能改善吗? (我认为我的图像写入方法相当慢。)

1 个答案:

答案 0 :(得分:0)

要遵循代码中的逻辑并不容易。看起来在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。您可以安排迷宫的内部表示形式以便将其加载吗?

[更正] 我的微观优化没有太大的改变;如预期的那样-编译器优化解决了这个问题。

但是,我运行了一个探查器,发现大部分时间都花在GL和GDI上。然后,我将fps速率从25更改为250,并获得了10倍的性能提升!可能是window.display();限制了您的循环吗?如果我将fps更改为2,则会减慢抓取速度...