2011-06-28 289 views
1

我有一个大的显示屏(约1000x2000像素)和我做下面的绘制图片到屏幕上:QPainter性能如何提高?

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

屏幕越大的是,我画到,时间越长这种涂料需要。我想pImage是memcpy'd,这是不同的。我怎样才能减少这种开销?我并没有试图在这里扩展或任何东西。

谢谢。

+0

如下所示:\t 我也应该注意到,我使用的是一个QImage,因为我操纵QIMAGE :: RGB16格式的原始图像缓冲区。基于此,我不知道我可以使用QPixmap来代替。你知道一种将QPixmap设置为该格式的原始图像缓冲区的方法吗? – glutz

+0

您不能将原始像素“填充”到QPixmap中。 QImage是正确的选择。如果相同的图像不会被多次绘制,无论如何都无法将其转换为QPixmap。这是什么平台?我知道Mac上的“加速”默认画家后端真的很慢。尝试从QImage创建一个画家,并看到相同的操作是更快。 –

+0

@Stephen Chu。我正在创建一个来自QImage的画家。或者你的意思是别的吗?我在Ubuntu 10.10上。 – glutz

回答

2

您正在绘制一个QImage。不要这样做,请尝试使用QPixmap。

QImage documentation

QImage的被设计和优化用于I/O,以及用于直接像素访问和操作,而的QPixmap被设计和用于在屏幕上显示的图像优化的“

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

PS:没有必要在堆上创建QImages,因为

由于QImage类使用隐式数据共享,QImage对象可以按值传递。

+0

我也应该注意到我使用的是一个QImage,因为我操作的是QIMAGE :: RGB16格式的原始图像缓冲区。基于此,我不知道我可以使用QPixmap来代替。你知道一种将QPixmap设置为该格式的原始图像缓冲区的方法吗? – glutz

+0

@glutz:您可以从原始数据创建QPixmaps,但之后无法更改数据并自动更改QPixmap。在X11上,像素图存储在服务器地址空间中,因此从客户端获取它是很昂贵的。也许尝试不重新生成每个油漆上的图像,但只有当实际发生变化时。 –

0

你可以做的一个简单的改进是只绘制需要更新的区域(如果可以的话)。 QPaintEvent包含已更改区域的矩形,并且QPainter::drawImage有重载,可以对要绘制的部分采取反向。

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