Прежде всего, самая важная часть информации относительно классов "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 могут быть хорошими решениями.