Как улучшить производительность QPainter?

У меня большой дисплей (около 1000x2000 пикселей), и я делаю следующее для рисования изображений на экране:

QImage *pImage = GetImage(); // from wherever
QPainter painter(this);   
painter.drawImage((0,0), *pImage);  // this line takes over 100ms to complete.

Чем больше экран, к которому я рисую, тем дольше длится эта краска. Я предполагаю, что pImage является memcpy'd, и в этом разница. Как я могу уменьшить эти накладные расходы? Я не пытаюсь масштабировать или что-то здесь.

Благодарю.

2 ответа

Вы рисуете QImage. Не делайте этого, попробуйте вместо этого использовать QPixmap.

Из документации QImage:

QImage разработан и оптимизирован для ввода-вывода, а также для прямого доступа к пикселям и манипулирования ими, а QPixmap разработан и оптимизирован для отображения изображений на экране ".

В зависимости от платформы получение данных QImage в формате и месте, необходимом для рисования, может быть чрезвычайно дорогим.

PS: Нет необходимости создавать QImages в куче, так как

Объекты QImage могут передаваться по значению, поскольку класс QImage использует неявный обмен данными.

Одно простое улучшение, которое вы можете сделать, это нарисовать только ту область, которая нуждается в обновлении (если вы можете). QPaintEvent содержит прямоугольник для измененной области, а QPainter::drawImage имеет перегрузки, которые могут принимать ректы для порции для рисования.

Вы также можете посмотреть на ImageConversionFlags варианты для более быстрых вариантов.

Другие вопросы по тегам