crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Тема закрытаНачать новую тему
> Моргание при отрисовке QImage
wiz29
  опции профиля:
сообщение 2.12.2010, 15:08
Сообщение #1


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Столкнулся со следующей проблемой: имеется некая сцена которая отрисовывается в QImage imgScene. (отрисовка происходит в отдельном потоке) имеется метод для копирования изображения (копия сцены рисутеся в гуи потоке) Возникает следующий эффект http://s013.radikal.ru/i325/1012/d6/792b6748b025.png такое ощущение что картинка еще не успела появится на экране приходит следующий paint event. Вопрос, как можно синхронизировать и почему получается такой эффект (картинка не успевает дорисоваться до конца сверху вниз).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 2.12.2010, 15:13
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


А как происходит синхронизация этих двух изображений? В какой момент копируется из потока в GUI?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 2.12.2010, 15:17
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Когда картинка содержащая изображение сцены готова, то посылается сигнал объекту гуи потока, по этому сигналу объект gui потока вызывает метод в котором происходит копирование QImageй, дальше рабочий поток вновь заполняет свои данные (оповещение объекта gui потока происходит не чаще чем через 40мс)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 2.12.2010, 15:19
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


А в потоке ожидается момент, когда GUI-поток скопирует картинку или сразу начинается формирование следующего кадра?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 2.12.2010, 15:22
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


да , там синхронизация по мьютексу


но копирование происходит посредством оператора = мб в это м проблема?

естьли смысл копировать из QImage например в QPixmap? (не будет ли при этом тормознее)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 2.12.2010, 15:23
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Т.е. ты посылаешь сигнал и блокируешь поток. А разблокируешь его только после завершения копирования?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 2.12.2010, 15:48
Сообщение #7


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


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

Просто ведь в QImage используется implicit share data copy может в этом проблема?

но тогда сомнительная выгода от использования рисования в QImage в отдельном потоке.

у меня сложилось ощущение что нужно делать вертикальную синхронизацию. Только как пока незнаю
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 2.12.2010, 16:08
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Вот смотри. Рабочий поток закончил формирование кадра, послал сигнал, этот сигнал положился в очередь GUI-потока, рабочий поток начал изменять картинку, в этот момент происходит переключение на GUI поток, который вызывает слот для копирования картинки, но она уже частично изменилась.
Или само рисование в рабочем потоке тоже закрывается мутексом?

Одно из решений использовать в рабочем потоке двойной буферизации.
Нарисовали кадр на первой картинке, отправили сигнал, переключились на вторую картинку и начали формировать следующий кадр. GUI-поток, получив сигнал о изменении, копирует себе первую готовую картинку. Рабочий поток завершил формировать следующий кадр на второй картинки, отсылает сигнал и переключается на первую, а GUI-поток копирует себе вторую картинку и все повторяется.
В этом варианте тоже есть тонкий момент: если формирующий поток будет успевать формировать несколько кадров, а GUI-поток, соответственно, не будет успевать их получать.

Сообщение отредактировал BRE - 2.12.2010, 16:19
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 2.12.2010, 16:32
Сообщение #9


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Щас попробую, просто ощущение создалось такое что нужно как то vsync сделать, не успевает вывести на экран.

не не помогло, полазил на форумах нокии там рекомендуют как использовать 1н паинтер для виджета , пишут что вроде как должно помоч.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 2.12.2010, 16:35
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(wiz29 @ 2.12.2010, 16:32) *
не не помогло, полазил на форумах нокии там рекомендуют как использовать 1н паинтер для виджета , пишут что вроде как должно помоч.

Как понять "1н паинтер для виждета"? :)

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Тема закрытаНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.6.2020, 19:15