Я разработал программу, которая в основном режет геометрическую фигуру во множество маленьких треугольников (в "левом холсте" ), применяет некоторые простые математические преобразования к кучу треугольников и перерисовывает их в своей новой конфигурации. См. Снимок экрана ниже.
Чтобы нарисовать эти треугольники, я использую QPainter::drawPolygon
. Каждый треугольник справа соответствует треугольнику слева, поэтому я знаю, какой цвет я хочу использовать для его рисования.
Пока, отлично. Даже если я рисую много больше треугольников, чем это (когда я использую гораздо меньшие треугольники, чтобы вырезать фигуру), это достаточно быстро.
Я добавил функцию в свою программу: я могу рисовать треугольники, извлеченные из изображения вместо простых треугольников: см. следующий захват экрана.
Проблема в том, что способ, которым я это делаю, слишком медленный. Вот как я это делаю:
- Я просматриваю все треугольники
- Для каждого треугольника я вычисляю координаты каждого пикселя, который будет отображаться.
- Для каждого из этих пикселей я вычисляю координаты соответствующего пикселя на изображении (это простая математическая операция), и я получаю этот цвет пикселя.
- Я использую
QPainter::setPen(QColor)
иQPainter::drawPoint(QPoint)
для рисования пикселя.
Я новичок в программировании в Qt, и я ничего не знаю о графике, так что это то, что я мог бы придумать. Проблема в том, что он "неприемлемо" слишком медленный (paintEvent
каждого холста занимает около 0,15 с по сравнению с 0,01 с в случае простых треугольников).
Я запустил профайлер, чтобы попытаться понять, что происходит, я заметил, что в виджете canvas paintEvent
,
- 58% времени потрачено на
QPainter::drawPoint
- 27% времени тратится на
QPainter::setPen
Похоже, что QPainter::drawPoint
слишком сложный и медленный: я просто хочу, чтобы он печатал пиксель заданного цвета, что он.
Возможно, я нашел решение моей проблемы: сохраните QImage
(как переменную-член моего виджета холста), которая представляет все, что я хочу, чтобы мой холст отображался, и полностью определял его в пикселе paintEvent
по пикселю, а затем нарисуйте его в конце моего paintEvent
с помощью QPainter::drawImage
. У меня есть намек на то, что это будет намного быстрее. Но прежде чем переписать мой код снова, я хотел бы знать, действительно ли это то, что я хочу сделать.
Надеюсь, я не заставил тебя убить! Большое спасибо заранее за ваши идеи.