Qt/C++:高效绘图

Seu*_*eub 18 c++ graphics qt pixel qpainter

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

屏幕帽1

为了绘制这些三角形,我使用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.我有一个提示,这会更快.但在我重新编写代码之前,我想知道这是否真的是我想要做的.

我希望我没有让你做死!非常感谢您的见解.

dor*_*ron 7

OpenGL非常适合图像(纹理)坐标映射.您可能想要使用某种形式的OpenGL.Qt对OpenGL有一定的约束力可以帮助你.


UmN*_*obe 4

非 OpenGL 解决方案:

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

QImage::QImage ( uchar * data, int width, int height, Format format )
Run Code Online (Sandbox Code Playgroud)

根据先前的缓冲区构造图像。它与您提供的解决方案很接近,并且比您当前拥有的解决方案要快得多。