Как улучшить производительность 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 разработан и оптимизирован для ввода-вывода, а также для прямого доступа к пикселям и манипулирования ими, а QPixmap разработан и оптимизирован для отображения изображений на экране ".
В зависимости от платформы получение данных QImage в формате и месте, необходимом для рисования, может быть чрезвычайно дорогим.
PS: Нет необходимости создавать QImages в куче, так как
Объекты QImage могут передаваться по значению, поскольку класс QImage использует неявный обмен данными.
Одно простое улучшение, которое вы можете сделать, это нарисовать только ту область, которая нуждается в обновлении (если вы можете). QPaintEvent
содержит прямоугольник для измененной области, а QPainter::drawImage
имеет перегрузки, которые могут принимать ректы для порции для рисования.
Вы также можете посмотреть на ImageConversionFlags
варианты для более быстрых вариантов.