为什么不使用预乘的 alpha 有"significantly worse performance"?



QPainter负责Qt中的绘制和合成。文档中有一节讨论性能。我的问题是关于下一段中加粗的一句话。

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

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

阿尔法乘法真的那么慢吗?也许他们只是说,他们没有像其他代码路径那样试图优化该代码路径,因此无法保证它的性能?

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

在您的情况下,这是有意义的,因为我假设某个小部件会绘制图像,并且假设它可能会绘制不止一次。在任何情况下,小部件在绘制过程中都会预乘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();
}
...
};

相关内容

  • 没有找到相关文章

最新更新