【问题标题】:How can QPainter performance be improved?QPainter 的性能如何提高?
【发布时间】:2011-06-28 19:38:09
【问题描述】:

我有一个大显示器(大约 1000x2000 像素),我正在执行以下操作以将图像绘制到屏幕上:

QImage *pImage = GetImage(); // from wherever
QPainter painter(this);   
painter.drawImage((0,0), *pImage);  // this line takes over 100ms to complete.

我要绘制的屏幕越大,绘制所需的时间就越长。我猜 pImage 正在被 memcpy 处理,这就是区别。我怎样才能减少这种开销?我不想在这里扩展或做任何事情。

谢谢。

【问题讨论】:

  • 如下所述:我还应该注意我正在使用 QImage,因为我正在处理 QIMAGE::RGB16 格式的原始图像缓冲区。基于此,我不确定我是否可以只使用 QPixmap。您知道将 QPixmap 设置为该格式的原始图像缓冲区的方法吗?
  • 您不能将原始像素“填充”到 QPixmap 中。 QImage 是正确的方法。而且,如果不会多次绘制相同的图像,那么转换为 QPixmap 也没有任何好处。这是在什么平台上的?我知道 Mac 上的“加速”默认画家后端真的很慢。尝试从 QImage 创建一个painter,然后查看相同的操作是否更快。
  • @Stephen Chu。我正在从 QImage 创建一个画家。还是你的意思是别的?我在 Ubuntu 10.10 上。
  • 我以为是物理屏幕。在某些平台上,Qt 使用实际上比软件引擎慢的“加速”绘图引擎。我认为 QImage 支持的画家始终是软件引擎,无论平台如何。我建议使用软件引擎。既然它不适合你,不妨试试 QPixmap 支持的画家?

标签: qt graphics qpainter


【解决方案1】:

你正在画一个 QImage。不要那样做,尝试使用 QPixmap。

来自QImage documentation

QImage 专为 I/O 以及直接像素访问和操作而设计和优化,而 QPixmap 专为在屏幕上显示图像而设计和优化。”

根据平台,将 QImage 数据转换为绘画所需的格式和位置可能非常昂贵。

P.S.:不需要在堆上创建QImages,因为

QImage 对象可以通过值传递,因为 QImage 类使用隐式数据共享。

【讨论】:

  • 我还应该注意,我使用的是 QImage,因为我正在处理 QIMAGE::RGB16 格式的原始图像缓冲区。基于此,我不确定我是否可以只使用 QPixmap。您知道将 QPixmap 设置为该格式的原始图像缓冲区的方法吗?
  • @glutz:您可以从原始数据创建 QPixmap,但之后您无法更改数据并自动更改 QPixmap。在 X11 上,像素图存储在服务器地址空间中,因此从客户端获取它的成本很高。也许尽量不要在每次绘制时都重新生成图像,但只有在实际发生更改时才重新生成。
【解决方案2】:

您可以做的一个简单改进是只绘制需要更新的区域(如果可以的话)。 QPaintEvent 包含一个用于更改区域的矩形,QPainter::drawImage 具有可以为要绘制的部分获取矩形的重载。

您还可以查看ImageConversionFlags 选项以获得更快的选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 2021-10-13
    • 2018-03-01
    • 2020-04-28
    • 2014-09-22
    • 2010-11-04
    相关资源
    最近更新 更多