【问题标题】:Why does not using premultiplied alpha have "significantly worse performance"?为什么使用预乘 alpha 没有“显着更差的性能”?
【发布时间】:2023-04-08 00:45:01
【问题描述】:

QPainter负责Qt中的绘图和合成。有一个section in the documentation 谈论性能。我的问题是关于下一段中的粗体句子。

Raster - 此后端在纯软件中实现所有渲染,并始终用于渲染到 QImages 中。为获得最佳性能,仅使用格式类型 QImage::Format_ARGB32_Premultiplied、QImage::Format_RGB32 或 QImage::Format_RGB16。 任何其他格式,包括 QImage::Format_ARGB32,性能明显较差。该引擎默认用于 QWidget 和 QPixmap。

我了解将颜色通道乘以 alpha 是在源操作中完成的。这种乘法可以提前完成,以避免在合成器中进行。执行此乘法涉及将 RGB 通道乘以 alpha,然后除以 255(或乘以以正确方式溢出以模仿除法的某个幻数)。这是每像素六个整数乘法。执行额外的六个整数乘法肯定不会有“明显更差的性能”吗?

alpha 乘法真的那么慢吗?也许他们只是说他们不会像其他人那样尝试优化该代码路径,因此无法保证它的执行方式?

【问题讨论】:

  • That's six integer multiplications per pixel,所以对于 4k 电影,它是 6 x 3840 x 2160 x 60 = ~3000M 次/秒
  • @IłyaBursov 这是很多乘法!不过,我并没有在我的应用程序中处理这种吞吐量。
  • That's six integer multiplications per pixel 哦,这很糟糕。很坏。任何体面的分辨率都有超过 500k 像素。单张图片 300 万次乘法可不是开玩笑的。

标签: performance qt colors compositing premultiplied-alpha


【解决方案1】:

请看这里的详细解释:https://pspdfkit.com/blog/2016/a-curious-case-of-android-alpha/ 当然,它并不是直接指 Qt,而是指为什么预乘位图有意义。

【讨论】:

  • 我阅读了这篇文章,但它没有回答我的问题。使用预乘 alpha 图像在 99% 的情况下都有意义,但在我的情况下则不然。
【解决方案2】:

在您的情况下这是有道理的,因为我假设某些小部件会绘制图像,并且假设它可能会多次绘制它。在任何情况下,小部件在绘制过程中都会预乘 alpha。所以你不妨对它非常明确——毕竟,图像格式转换是单行的,所以你不必编写一页代码来处理它。所以:

class MyViewer : public QWidget {
  Q_OBJECT
  QImage m_image;
public:
  Q_SLOT void setImage(const QImage &image) {
    m_image = image.convertToFormat(QImage::Format_ARGB32_Premultiplied);
    update();
  }
  ...
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2012-09-22
    • 1970-01-01
    • 2013-11-04
    • 2015-06-04
    • 1970-01-01
    • 2021-12-02
    相关资源
    最近更新 更多