Является ли функция QPainter :: setPen дорогой? - PullRequest
0 голосов
/ 07 ноября 2019

Мой код рисует линию, которая состоит из нескольких сегментов и окружностей на вершинах.

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]);
    }
}

Я вызываю QPainter :: setPen много раз внутри цикла for. Это хорошо с точки зрения производительности? Является ли QPainter :: setPen быстрой функцией? (Я знаю, что переключение материала в 3D-графике - медленная операция, но, вероятно, это не так для 2D-чертежа с графическим интерфейсом.) Или, возможно, отдельные циклы более оптимальны?

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 Ответ

0 голосов
/ 07 ноября 2019

Конечно, меняя ручку не так дорого. Но если это возможно, разделите петли, чтобы минимизировать смену пера. Когда вы меняете перо, в QPaintEngine будет установлен флаг DirtyPen , который затем заставляет выполнять потенциальные задачи перед следующей командой рисования. Вы должны профилировать его в своей собственной реализации, чтобы увидеть, сколько микросекунд вы сэкономите, разделяя циклы.

...