Как улучшить производительность QPainter? - PullRequest
1 голос
/ 28 июня 2011

У меня большой дисплей (около 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 ]

2 голосов
/ 29 июня 2011

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

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

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

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

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

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

0 голосов
/ 29 июня 2011

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

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

...