Qt:在另一个线程中预加载 qpixmap?

Posted

技术标签:

【中文标题】Qt:在另一个线程中预加载 qpixmap?【英文标题】:Qt: Preload the qpixmap in another thread? 【发布时间】:2015-04-19 12:01:52 【问题描述】:

Qt的文档说QImage不能用于硬件加速(显卡)。 而且你需要使用只能在主线程中使用的QPixmap。

但我的情况是:我需要通过读取 QBytearray 来获取图像。如果我在主线程中将 QBytearray 转换为 qpixmap 会很慢。

所以我在工作线程中将字节数组转换为 QImage。 但是文档也说从 QImage 到 QPixmap 的转换很昂贵。

那么有什么解决方案可以让我使用工作线程将字节数组转换为图像并仍然使用硬件加速来绘制它? openGL 是唯一的选择吗?

【问题讨论】:

我刚才问了same question。显然,尽管在唯一答案中报告了什么,但您可以在另一个线程中从 QImage 构建 QPixmap,至少在 Windows 上是这样。 【参考方案1】:

QPixmap 代表平台原生像素图,享有一定程度的硬件加速,但对某些平台有限制,可能是极端情况,但仍然适用。

您可以选择以稍微慢一些为代价来坚持安全的方式,或者如果您只针对可以运行的平台,您也可以选择坚持不安全的方式。

无论如何,QImage 可能会更慢,但你真的发现了性能问题吗?因为你没有一个,直到你证明你有。我的意思是即使速度较慢,QImage 可能仍然足够快,例如在我的 PC 上,我在 68 毫秒内在 1000x1000 像素图上绘制 100 万个点(不是像素),QImage 分别为 138 毫秒 - 138 就像速度慢了一倍,但仍然可以忍受等待 138 毫秒来绘制绘图。

【讨论】:

那么,让事情变得更快的唯一方法就是使用 opengl? 正如我所说,如果您确实有性能问题,您可以花时间进行 OpenGL 绘图,但我不完全确定这是否值得。此外,这取决于您所说的“使用 opengl”是什么意思 - 因为这本身就是一个广泛的话题...... 问题是不能合理的使用QImage来显示图片。所有的 Qt 类(QIcon、QGraphicsPixmapItem 等)都需要一个 QPixmap。您可以重写其中一些以使用 QImage,但这不是一个很好的解决方案。 你可以在任何QPaintDevice上画一个QImage

以上是关于Qt:在另一个线程中预加载 qpixmap?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 7 中预加载数据库

使用“预加载”链接指令在 Chrome 中预加载字体

在 CATiledLayer 中预加载/预显示图块?

在linux中预加载动态加载的库

在 Flutter 应用中预加载(所有)图像资源

在 Android 中预加载网页(使用 WebView?)