QPainter::setPen 函数是不是昂贵?

Posted

技术标签:

【中文标题】QPainter::setPen 函数是不是昂贵?【英文标题】:Is QPainter::setPen function expensive?QPainter::setPen 函数是否昂贵? 【发布时间】:2019-11-07 01:56:29 【问题描述】:

我的代码在顶点上绘制了一条由若干段和圆组成的线。

void Line::paintLine(QPainter* painter, const std::vector<QPointF>& line)

    QBrush brush(m_fillColor);
    painter->setBrush(brush);
    painter->setOpacity(m_opacity);

    QPen pen(m_lineColor, 1);

    painter->setPen(Qt::NoPen);
    painter->drawEllipse(line[0], CircleRadius, CircleRadius);

    for (int i = 1; i < line.size(); ++i)
    
        painter->setPen(Qt::NoPen);
        painter->drawEllipse(line[i], CircleRadius, CircleRadius);

        painter->setPen(pen);
        painter->drawLine(line[i-1], line[i]);
    

我在 for 循环中多次调用 QPainter::setPen。这在性能方面好吗? QPainter::setPen 是快速功能吗? (我知道 3D 图形中的材质切换操作很慢,但对于 2D GUI 绘图可能不是这样。) 或者单独的循环可能更优化?

void Line::paintLine(QPainter* painter, const std::vector<QPointF>& line)

    QBrush brush(m_fillColor);
    painter->setBrush(brush);
    painter->setOpacity(m_opacity);

    QPen pen(m_lineColor, 1);

    painter->setPen(Qt::NoPen);
    for (int i = 0; i < line.size(); ++i)
        painter->drawEllipse(line[i], CircleRadius, CircleRadius);

    painter->setPen(pen);
    for (int i = 1; i < line.size(); ++i)
        painter->drawLine(line[i-1], line[i]);

【问题讨论】:

您是否尝试分析您的代码? 【参考方案1】:

换笔肯定没那么贵。但如果可能的话,分开你的循环以尽量减少笔的变化。当您更换笔时,DirtyPen 标志将在QPaintEngine 中设置,然后强制在下一个绘制命令之前完成潜在任务。您应该在自己的实现中对其进行分析,以查看通过分离循环可以节省多少微秒。

【讨论】:

以上是关于QPainter::setPen 函数是不是昂贵?的主要内容,如果未能解决你的问题,请参考以下文章

使用单色 QImage

SQL Server 中的“BETWEEN”函数是不是非常昂贵?

阅读 app.config 是不是昂贵?

PHP 是不是包含资源昂贵(特别是在迭代期间)?

函数式编程 - 不变性昂贵吗? [关闭]

PublishSubject 为所有观察者调用昂贵的函数