Qt / C ++:高效地绘制?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (30)

我设计了一个程序,它基本上将几何形状切割成许多小三角形(在“左画布”中),对一束三角形应用一些简单的数学变换,并将它们重新绘制为它们的新配置。请参阅下面的截图。

为了绘制这些三角形,我使用QPainter::drawPolygon。右边的每个三角形对应左边的一个三角形,所以我知道我想用什么颜色来绘制它。

到目前为止,没关系。即使画出更多的三角形(当我使用更小的三角形来切割形状时),这足够快了。

我为我的程序添加了一个功能:我可以绘制从图片中提取的三角形,而不是三角形:请参阅以下屏幕截图。

问题是我这样做的方式太慢了。以下是我的做法:

  1. 我穿过所有的三角形
  2. 对于每个三角形,我计算将要显示的每个像素的坐标。
  3. 对于这些像素中的每一个,我计算图片上相应像素的坐标(这是一个简单的数学运算),然后检索该像素的颜色。
  4. 我使用QPainter::setPen(QColor)QPainter::drawPoint(QPoint)绘制像素。

我是Qt编程新手,我对图形一无所知,所以这是我能想到的。问题在于它“太不可接受”太慢(paintEvent每个画布大约需要0.15s,而在普通三角形的情况下则为0.01s)。

我运行一个分析器来试图了解发生了什么,我注意到在画布部件中paintEvent

  1. 58%的时间都花在了 QPainter::drawPoint
  2. 27%的时间都花在了 QPainter::setPen

看起来QPainter::drawPoint太复杂和慢了:我只是想让它打印给定颜色的像素,就是这样。

我可能已经找到了解决我的问题的方法:存储一个QImage(作为我的画布小部件的成员变量),它代表我希望画布显示的所有内容,并且完全按paintEvent像素逐像素地定义它,然后立即绘制它在我结束paintEventQPainter::drawImage。我有一个暗示,这将更快。但在我重新编写代码之前,我想知道这是否真的是我想要做的。

提问于
用户回答回答于

非OpenGl解决方案:

为目标图像使用RGB缓冲区。像以前一样完成你的3个第一步。找到位置和像素颜色后,将其设置在此缓冲区上。然后你使用

QImage::QImage ( uchar * data, int width, int height, Format format )

基于前一个缓冲区构建图像。它接近你提供的解决方案,并且将比你目前的解决方案快得多。

用户回答回答于

OpenGL很好地完成了图像(纹理)坐标映射。你可能想要使用某种形式的OpenGL。Qt有一些绑定到OpenGL,可以帮助你。

扫码关注云+社区