内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用
我设计了一个程序,它基本上将几何形状切割成许多小三角形(在“左画布”中),对一束三角形应用一些简单的数学变换,并将它们重新绘制为它们的新配置。请参阅下面的截图。
为了绘制这些三角形,我使用QPainter::drawPolygon
。右边的每个三角形对应左边的一个三角形,所以我知道我想用什么颜色来绘制它。
到目前为止,没关系。即使画出更多的三角形(当我使用更小的三角形来切割形状时),这足够快了。
我为我的程序添加了一个功能:我可以绘制从图片中提取的三角形,而不是三角形:请参阅以下屏幕截图。
问题是我这样做的方式太慢了。以下是我的做法:
QPainter::setPen(QColor)
并QPainter::drawPoint(QPoint)
绘制像素。我是Qt编程新手,我对图形一无所知,所以这是我能想到的。问题在于它“太不可接受”太慢(paintEvent
每个画布大约需要0.15s,而在普通三角形的情况下则为0.01s)。
我运行一个分析器来试图了解发生了什么,我注意到在画布部件中paintEvent
,
QPainter::drawPoint
QPainter::setPen
看起来QPainter::drawPoint
太复杂和慢了:我只是想让它打印给定颜色的像素,就是这样。
我可能已经找到了解决我的问题的方法:存储一个QImage
(作为我的画布小部件的成员变量),它代表我希望画布显示的所有内容,并且完全按paintEvent
像素逐像素地定义它,然后立即绘制它在我结束paintEvent
时QPainter::drawImage
。我有一个暗示,这将更快。但在我重新编写代码之前,我想知道这是否真的是我想要做的。
非OpenGl解决方案:
为目标图像使用RGB缓冲区。像以前一样完成你的3个第一步。找到位置和像素颜色后,将其设置在此缓冲区上。然后你使用
QImage::QImage ( uchar * data, int width, int height, Format format )
基于前一个缓冲区构建图像。它接近你提供的解决方案,并且将比你目前的解决方案快得多。