Моргание при отрисовке QImage |
Здравствуйте, гость ( Вход | Регистрация )
Моргание при отрисовке 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 |
|
|
|
Текстовая версия | Сейчас: 29.3.2024, 17:47 |