我设计了一个程序,基本上,将几何形状切割成许多小三角形(在“左侧画布”中),对三角形束应用一些简单的数学变换,并以新的配置重新绘制它们。请参阅下面的屏幕截图。
为了绘制这些三角形,我使用QPainter::drawPolygon
. 右边的每个三角形对应左边的一个三角形,所以我知道我想用什么颜色来绘制它。
到目前为止,很好。即使我画了比这更多的三角形(当我使用小得多的三角形来切割形状时),这也足够快了。
我在我的程序中添加了一个功能:我可以绘制从图片中提取的三角形而不是普通的三角形:请参阅以下屏幕截图。
问题是我这样做的方式太慢了。这是我的做法:
- 我穿过所有的三角形
- 对于每个三角形,我计算将要显示的每个像素的坐标。
- 对于这些像素中的每一个,我计算图片上相应像素的坐标(这是一个简单的数学运算),然后检索该像素的颜色。
- 我使用
QPainter::setPen(QColor)
andQPainter::drawPoint(QPoint)
来绘制像素。
我是 Qt 编程的新手,我对图形一无所知,所以这就是我能想到的。问题是它“不可接受”太慢了(paintEvent
每个画布的 0.15 秒,而普通三角形的 0.01 秒)。
我运行了一个分析器试图了解发生了什么,我注意到在画布小部件paintEvent
的
- 58%的时间花在
QPainter::drawPoint
- 27% 的时间花在
QPainter::setPen
这似乎QPainter::drawPoint
太复杂和太慢了:我只想让它打印给定颜色的像素,就是这样。
我可能已经找到了解决我的问题的方法:存储一个QImage
(作为我的画布小部件的成员变量),它代表我希望我的画布显示的全部内容,并在我paintEvent
的逐像素中完全定义它,然后立即绘制它在我的paintEvent
结尾QPainter::drawImage
。我暗示这会快得多。但在我重新重写我的代码之前,我想知道这是否真的是我想要做的。
我希望我没有烦死你!非常感谢您的见解。