我正在努力学习逐一实现所有的迷宫生成算法,我的第一个迷宫生成算法是dfs回溯(非递归(,我已经完成了实现,我已经使用了cpp和sfml。
我通过使用1d矢量和位场对其进行了优化,绘制单元大小为2的9000 x 9000迷宫的最终结果约为1分46秒(直接写入图像no gui(。
这还能改善吗?(我觉得我的图像书写方法很慢。(
遵循代码中的逻辑并不容易。看起来在Maze::checkNeighbours
中,您使用x
和y
作为坐标(其中,由于某种原因,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;
我也想看看你的turnOnBit
、turnOffBit
和checkBit
,因为它们被称为LOT。
至于保存图像,尽管我不知道sfml,但使用SetPixel
通常对性能非常不利。看起来有sf::Image::loadFromMemory。你能安排你的迷宫内部表示,这样它就可以被加载了吗?
[CORRECTION]我的微观优化没有太大区别;正如预期的那样,编译器优化处理了这一点。
然而,我运行了一个探查器,注意到大部分时间都花在GL和GDI上。然后我把帧速率从25改为250,性能提高了10倍!可能是window.display();
抑制了你的循环吗?如果我将fps更改为2,它会减慢为爬行。。。