0

QPainter负责Qt中的绘图和合成。文档中有一个部分讨论了性能。我的问题是关于下一段中的粗体句子。

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

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

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

4

2 回答 2

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();
  }
  ...
};
于 2019-02-07T14:36:49.357 回答
0

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

于 2019-02-07T10:35:24.933 回答