crossplatform.ru

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

> Урок 11 Попробуем выстрелить;Баг отрисовки - как исправить?, "Мерцание" отрисовки, искажение формы снаряда
I_Wanna_Know
  опции профиля:
сообщение 28.8.2014, 16:40
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 20
Регистрация: 28.8.2014
Пользователь №: 4213

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




Репутация:   0  


Доброго времени суток уважаемые форумчане!

Я новичок в Qt, изучаю фреймворк по урокам с вашего портала(за что отдельное спасибо старавшимся) в общем то в этом уроке , при компиляции его с исходников (всё корректно скопипаcтенно опечатки исправлены) происходит некорректное отображение снаряда он по всей траектории полёта меняет свой размер(становится то больше то меньше), не на всём пути траектории отрисовывается и внезапно рывками появляется дальше по траектории и как бы "мерцает", сначала думал что это проблемы буфферизации, но почитав доки понял вроде как с Qt4+ двойная буферизация в виджетах включена по умолчанию ...в общем не знаю что и думать, помогите пожалуйста исправить этот баг или хотя бы подскажите как в рамках этого урока по другому переписать виджет.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
I_Wanna_Know
  опции профиля:
сообщение 31.8.2014, 17:06
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 20
Регистрация: 28.8.2014
Пользователь №: 4213

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




Репутация:   0  


Цитата(FireBlack @ 30.8.2014, 13:27) *
Проще всего данный баг лечится простой заменой update(region); на update(); в функции CannonField::moveShot().


Огромное спасибо! Помогло! Эм если не затруднит не могли бы вы подробно объяснить почему так происходит?
Кстати иногда есть ещё такой слегка едва заметный шлейф типо тень от снаряда т.е это вроде бы(не уверен) отрисовка снаряда на предидущей позиции когда снаряд уже в следующей точке как бы это поправить?

Цитата(FireBlack @ 30.8.2014, 13:27) *
Кстати, чтобы избавиться от эффекта антиалиазинга (при отрисовки орудия) стоит добавить painter.setRenderHint(QPainter::Antialiasing, true); после QPainter painter(this); в функции CannonField::paintEvent(QPaintEvent *).

Ещё раз спасибо, что откликнулись, но об этом я знал и антиалиазинг сразу же включил :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FireBlack
  опции профиля:
сообщение 1.9.2014, 5:25
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 38
Регистрация: 17.10.2010
Из: г.Пенза
Пользователь №: 2121

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




Репутация:   1  


Цитата(I_Wanna_Know @ 31.8.2014, 17:06) *
Эм если не затруднит не могли бы вы подробно объяснить почему так происходит?

Точно не скажу, но предполагаю что region неполностью охватывает облать, необходимую для перерисовки. Свою теорию подтверждаю следующим кодом, где увеличиваю region на 10 пикселей в ширину и в высоту:
void CannonField::moveShot()
{
    QRect region = shotRect();
    ++timerCount;

    QRect shotR = shotRect();
    if (shotR.x() > width() || shotR.y() > height()) {
        autoShootTimer->stop();
    } else {
        region = region.united(shotR);
        const int margin = 5;
        region.adjust(-margin, -margin, margin, margin);
    }
    update(region);
}

Хотя это не решение, а костыль, т.к. он не учитывает скорость снаряда и если ее увеличить - мерцание опять появится.
Вообще, приведенный в примере код, должен теоретически работать корректно, может быть данные проблемы связаны с конкретной реализацией?! Неплохо бы проверить на Linux'е данный пример.

Цитата(I_Wanna_Know @ 31.8.2014, 17:06) *
Кстати иногда есть ещё такой слегка едва заметный шлейф типо тень от снаряда т.е это вроде бы(не уверен) отрисовка снаряда на предидущей позиции когда снаряд уже в следующей точке как бы это поправить?

Думаю это не более чем оптическая иллюзия из-за высокой скорости снаряда. Можете сами проверить, заменив autoShootTimer->start(5); на autoShootTimer->start(50); в функции CannonField::shoot().
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 28.4.2024, 18:26