Быстрое обновление QPixmap из байтового массива - PullRequest
5 голосов
/ 19 октября 2010

Я работаю над приложением Vision, и мне нужно, чтобы на экране отображался «Live View» с камеры, используя объект QPixmap.Мы будем обновлять экран со скоростью 30 кадров в секунду на постоянной основе.

Моя проблема в том, что это приложение должно работать на компьютерах 3-5 лет, которые, по современным стандартам, работают медленно.Поэтому я хотел бы иметь возможность напрямую записывать в байтовый массив дисплея внутри QPixmap.После просмотра кода программы, почти возможность изменения содержимого Pixmap приводит к созданию новой QPixmap.Это накладные расходы, которые я пытаюсь использовать.

Кроме того, я бы хотел предотвратить возникновение всех новых / удалений, просто чтобы держать фрагментацию памяти под контролем.

Есть предложения?

Ответы [ 2 ]

13 голосов
/ 19 октября 2010

Прежде всего, самая важная часть информации относительно классов "picture" в Qt:

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

Это означает, что QPixmap является обобщенным представлением собственного формата образа вашей платформы: Pixmap в Unix, HBITMAP в Windows, CGImageRef в Mac. QImage - это класс «массив пикселей с операциями».

Я предполагаю следующее:

  • Вы читаете необработанные кадры камеры в определенном пиксельном формате
  • У вас на самом деле есть проблемы с фрагментацией памяти (в отличие от эмоциональных проблем)

Мой совет - использовать QImage вместо QPixmap. В частности, существует конструктор, который принимает необработанный байтовый массив и использует его непосредственно в качестве пиксельного буфера:

QImage::QImage(uchar *data, int width, int height, int bytesPerLine, Format format)

Создав QImage, используйте QPainter, чтобы нарисовать его в виджет с желаемой частотой. Имейте в виду, что:

  • Если вы читаете необработанные кадры камеры, преобразование формата все еще может быть необходимо. Дважды в худшем случае: Камера ➔ Qimage ➔ Платформа Bitmap.
  • Вы не можете избежать выделения памяти из свободного хранилища при использовании QPixmap и QImage: они являются неявно общими классами и обязательно выделяют память из свободного хранилища. (С другой стороны, это означает, что вам не следует создавать новые / удалять их явно.)

Нашей команде удалось плавно отобразить полноэкранное сжатое видео на компьютерах с процессором Atom, используя только Qt (хотя и с более низкой частотой кадров). Однако, если это не решит вашу проблему, я бы обошел Qt и использовал собственный API рисования. Если вам абсолютно необходима независимость от платформы, то OpenGL или SDL могут быть хорошими решениями.

0 голосов
/ 19 октября 2010

Я обнаружил, что QImages быстрее для операций прямого ввода-вывода.

Не могли бы вы предоставить более подробную информацию о том, что вы получаете и пытаетесь сделать с QPixmap?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...