为什么不使用预乘alpha却具有“明显较差的性能”?

时间:2019-02-07 00:10:57

标签: performance qt colors compositing premultiplied-alpha

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乘法真的那么慢吗?也许他们只是说他们没有像其他人那样尝试优化该代码路径,所以不能保证它的性能吗?

2 个答案:

答案 0 :(得分:0)

请在此处查看详细说明:https://pspdfkit.com/blog/2016/a-curious-case-of-android-alpha/ 当然,它不是指Qt的透明度,而是指为什么预乘位图有意义的情况。

答案 1 :(得分:0)

在您的情况下,这很有道理,因为我假设某些小部件可以绘制图像,并且假定它可以绘制多次。无论如何,在绘画过程中,小部件将预乘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();
  }
  ...
};