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 函数是不是昂贵?的主要内容,如果未能解决你的问题,请参考以下文章