Russian Qt Forum
Ноябрь 23, 2024, 19:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QPixmap vs. QImage  (Прочитано 19093 раз)
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #15 : Сентябрь 02, 2011, 12:56 »

Непонятно с синхронизацией - как paintEvent (которое может прийти в любой момент) узнает что mIimage обновлен? И что делать если еще нет?  
m_Image - текущее результирующее изображение, предназначенное для отображения. Отображается таким какое есть. В каждом потоке своё изображение, которое копируется в результирующее изображение по мере готовности. paintEvent() не должен знать про степень готовности m_Image. Имея в каждом потоке свой m_Image можно не беспокоиться насчёт синхронизации Улыбающийся
« Последнее редактирование: Сентябрь 02, 2011, 12:58 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Сентябрь 02, 2011, 14:36 »

m_Image - текущее результирующее изображение, предназначенное для отображения. Отображается таким какое есть. В каждом потоке своё изображение, которое копируется в результирующее изображение по мере готовности. paintEvent() не должен знать про степень готовности m_Image. Имея в каждом потоке свой m_Image можно не беспокоиться насчёт синхронизации Улыбающийся
Хорошо, пусть "что-то изменилось", и нужно показать новый имедж. Каким образом Вы скажете нитке (рисующей в QPixmap или QImage) что нужно заняться рисованием? И как остановить ее когда отрисовано? Не вижу этого в приведенных фрагментах кода.

Ладно, допустим как-то сказали и вызвали update. Но ведь paintEvent может прийти раньше чем нитка займется рисованием - она вернет старый имедж. Откуда возьмете следующий update?  Так что про "степень готовности" главная нитка должна знать, иначе какие-то обновления не будут отображаться.

Да, в этом случае используется встроенный растровый движок. Но не факт, что это не быстро. Это может быть быстрее, т.к. в случае пиксмапа используется слишком жирная прослойка в виде иксов.
Ладно, будет минутка - проверю  Улыбающийся

Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #17 : Сентябрь 02, 2011, 15:45 »

Вопрос к размышлению - зачем туи мьютексы?
Присваивание (то есть свап) кутешных шаред классов - атомарная операция, насколько мне известно.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Сентябрь 02, 2011, 19:06 »

Вопрос к размышлению - зачем туи мьютексы?
Присваивание (то есть свап) кутешных шаред классов - атомарная операция, насколько мне известно.
Это дает только что N ниток могут одновременно читать (и расшаривать) такую переменную - но не спасает от crash если запись и чтение выполняются параллельно.

Поизучал маленько (аттач). Результат на OSX меня удивил:

- прямой вывод на экран - менее 1 сек
- вывод в QPixmap а потом на экран - 12 сек
- вывод в QImage потом на экран - тоже примерно 12 сек

Отключал финальный вывод (drawImage, drawPixmap), ну минус пол-секунды. Профайлер показывает что во всех случаях используется одна и та же Qt Engine. Вывод текста позорно медленный, все съедается на извлечении glyph(ов) - вернее на защищающей эту операцию блокировке.

Еще одной неожиданностью оказалось что repaint вовсе не перерисовывает немедленно. Похоже что он засылает в очередь сообщение UpdateRequest (не путать с update). В любом случае repaint не зовет paintEvent сам, нужен processEvents 

Возможно это "только текст" и "только OSX" - у меня нет оснований обобщать
Записан
nike1987
Гость
« Ответ #19 : Сентябрь 14, 2011, 18:40 »

У меня наверное схожий вопрос автора, необходимо загружать на сцену(QGraphicsScene) довольно-таки увесистые изображения и периодически обновлять их.Сей час работает схема Qimage.load + Qpixmap.convertFromImage.Возможно ли ускорить как-то добавление изображения на сцену?Для добавления использую стандартную функцию сцены addPixmap().
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 23.