Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
I_Wanna_Know |
28.8.2014, 16:40
Сообщение
#1
|
|
Студент ![]() Группа: Участник Сообщений: 20 Регистрация: 28.8.2014 Пользователь №: 4213 Спасибо сказали: 0 раз(а) Репутация: 0
|
Доброго времени суток уважаемые форумчане!
Я новичок в Qt, изучаю фреймворк по урокам с вашего портала(за что отдельное спасибо старавшимся) в общем то в Link , при компиляции его с исходников (всё корректно скопипаcтенно опечатки исправлены) происходит некорректное отображение снаряда он по всей траектории полёта меняет свой размер(становится то больше то меньше), не на всём пути траектории отрисовывается и внезапно рывками появляется дальше по траектории и как бы "мерцает", сначала думал что это проблемы буфферизации, но почитав доки понял вроде как с Qt4+ двойная буферизация в виджетах включена по умолчанию ...в общем не знаю что и думать, помогите пожалуйста исправить этот баг или хотя бы подскажите как в рамках этого урока по другому переписать виджет. |
|
|
|
|
FireBlack |
30.8.2014, 12:27
Сообщение
#2
|
![]() Студент ![]() Группа: Участник Сообщений: 38 Регистрация: 17.10.2010 Из: г.Пенза Пользователь №: 2121 Спасибо сказали: 13 раз(а) Репутация: 1
|
Проще всего данный баг лечится простой заменой update(region); на update(); в функции CannonField::moveShot().
Кстати, чтобы избавиться от эффекта антиалиазинга (при отрисовки орудия) стоит добавить painter.setRenderHint(QPainter::Antialiasing, true); после QPainter painter(this); в функции CannonField::paintEvent(QPaintEvent *). |
|
|
|
|
I_Wanna_Know |
31.8.2014, 17:06
Сообщение
#3
|
|
Студент ![]() Группа: Участник Сообщений: 20 Регистрация: 28.8.2014 Пользователь №: 4213 Спасибо сказали: 0 раз(а) Репутация: 0
|
Цитата(FireBlack @ 30.8.2014, 13:27) Link Проще всего данный баг лечится простой заменой update(region); на update(); в функции CannonField::moveShot(). Огромное спасибо! Помогло! Эм если не затруднит не могли бы вы подробно объяснить почему так происходит? Кстати иногда есть ещё такой слегка едва заметный шлейф типо тень от снаряда т.е это вроде бы(не уверен) отрисовка снаряда на предидущей позиции когда снаряд уже в следующей точке как бы это поправить? Цитата(FireBlack @ 30.8.2014, 13:27) Link Кстати, чтобы избавиться от эффекта антиалиазинга (при отрисовки орудия) стоит добавить painter.setRenderHint(QPainter::Antialiasing, true); после QPainter painter(this); в функции CannonField::paintEvent(QPaintEvent *). Ещё раз спасибо, что откликнулись, но об этом я знал и антиалиазинг сразу же включил |
|
|
|
|
FireBlack |
1.9.2014, 5:25
Сообщение
#4
|
![]() Студент ![]() Группа: Участник Сообщений: 38 Регистрация: 17.10.2010 Из: г.Пенза Пользователь №: 2121 Спасибо сказали: 13 раз(а) Репутация: 1
|
Цитата(I_Wanna_Know @ 31.8.2014, 17:06) Link Эм если не затруднит не могли бы вы подробно объяснить почему так происходит? Точно не скажу, но предполагаю что region неполностью охватывает облать, необходимую для перерисовки. Свою теорию подтверждаю следующим кодом, где увеличиваю region на 10 пикселей в ширину и в высоту: Хотя это не решение, а костыль, т.к. он не учитывает скорость снаряда и если ее увеличить - мерцание опять появится. Вообще, приведенный в примере код, должен теоретически работать корректно, может быть данные проблемы связаны с конкретной реализацией?! Неплохо бы проверить на Linux'е данный пример. Цитата(I_Wanna_Know @ 31.8.2014, 17:06) Link Кстати иногда есть ещё такой слегка едва заметный шлейф типо тень от снаряда т.е это вроде бы(не уверен) отрисовка снаряда на предидущей позиции когда снаряд уже в следующей точке как бы это поправить? Думаю это не более чем оптическая иллюзия из-за высокой скорости снаряда. Можете сами проверить, заменив autoShootTimer->start(5); на autoShootTimer->start(50); в функции CannonField::shoot(). |
|
|
|
|
Litkevich Yuriy |
1.9.2014, 9:39
Сообщение
#5
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94
|
Цитата(FireBlack @ 1.9.2014, 8:25) Link но предполагаю что region неполностью охватывает облать, необходимую для перерисовки. почти верно. Функция update() не перересовывает виджет, а только планирует его перерисовку (всего виджета или только его части). А вот сама перерисовка произойдёт через неопределённое время, поэтой причине пытаться учесть скорость не получиться. А ограничить перерисовку некоторой областью хочется, чтобы сократить затраты времени на неё.... т.к. он не учитывает скорость снаряда По этому реальный выход из ситуации - эксперементально подобрать область виджета, в которой (одновременно) только что был, и в которой может оказаться снаряд. |
|
|
|
|
I_Wanna_Know |
1.9.2014, 11:19
Сообщение
#6
|
|
Студент ![]() Группа: Участник Сообщений: 20 Регистрация: 28.8.2014 Пользователь №: 4213 Спасибо сказали: 0 раз(а) Репутация: 0
|
Цитата(FireBlack @ 1.9.2014, 6:25) Link Точно не скажу, но предполагаю что region неполностью охватывает облать, необходимую для перерисовки Я тоже о чём то подобном думал, но Цитата(FireBlack @ 1.9.2014, 6:25) Link он не учитывает скорость снаряда и если ее увеличить - мерцание опять появится. Учитывая это мне начинает казаться, что это не из-за того что он не всю область охватывает, а в том как работает сама функция update и учитывая Цитата(Litkevich Yuriy @ 1.9.2014, 10:39) Link Функция update() не перересовывает виджет, а только планирует его перерисовку (всего виджета или только его части). А вот сама перерисовка произойдёт через неопределённое время, И вызовется PaintEvent это написано в описании этой функции, но я то думал что это как раз таки для повышения производительности и более быстрой отрисовки оказалось что чуть ли не наоборот... Цитата(Litkevich Yuriy @ 1.9.2014, 10:39) Link поэтой причине пытаться учесть скорость не получиться. А ограничить перерисовку некоторой областью хочется, чтобы сократить затраты времени на неё. По этому реальный выход из ситуации - эксперементально подобрать область виджета, в которой (одновременно) только что был, и в которой может оказаться снаряд. А вот это уже полный геморой как то это не красиво чтоли.... Кстати Litkevich Yuriy быть может вы знаете более надёжный и быстрый способ отрисовки 2D графики в Qt ? Вообще с помощью чего можно переделать этот урок?! З.Ы, жаль на этом форуме нет функционала редактирования или удаления своих постов :-( |
|
|
|
|
FireBlack |
1.9.2014, 21:36
Сообщение
#7
|
![]() Студент ![]() Группа: Участник Сообщений: 38 Регистрация: 17.10.2010 Из: г.Пенза Пользователь №: 2121 Спасибо сказали: 13 раз(а) Репутация: 1
|
Цитата(I_Wanna_Know @ 1.9.2014, 12:19) Link ... может вы знаете более надёжный и быстрый способ отрисовки 2D графики в Qt ? Вообще с помощью чего можно переделать этот урок?! Хоть, вопрос адресован и не мне, постараюсь ответить: можно использовать сочетание Link и Link. В документации есть множество Link. В данном случае о головной боли с перерисовкой можно вообще забыть т.к. все это реализовано автоматически. Необходимо только перемещать снаряд изменяя его координаты. Цитата(I_Wanna_Know @ 1.9.2014, 12:19) Link З.Ы, жаль на этом форуме нет функционала редактирования или удаления своих постов :-( Подобный функционал скорее всего есть, но новичкам он не доступен. |
|
|
|
|
Litkevich Yuriy |
3.9.2014, 11:21
Сообщение
#8
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94
|
Цитата(I_Wanna_Know @ 1.9.2014, 14:19) Link но я то думал что это как раз таки для повышения производительности и более быстрой отрисовки первая часть верна, в целом ПО работает быстрее, за счёт того, что рисование происходит не часто.Цитата(I_Wanna_Know @ 1.9.2014, 14:19) Link надёжный и быстрый способ отрисовки 2D графики в Qt т.н. в Qt система Arthur, т.е. использование QPainter в обработчике события paintEvent - это самый быстрый способ в Qt что-либо нарисовать, но он низкоуровневый.В целом задача со снарядом решаема, только ручной работы много (можно запомнить область в которой снаряд был, а затем в обработчике рисования стереть только её, и т.п.) Примеры по низкоуровневому рисованию смотрите в демке: %QTDIR%\demos\affine Более удобный (но и более медленный) - Link Цитата(FireBlack @ 2.9.2014, 0:36) Link Подобный функционал скорее всего есть, но новичкам он не доступен. через 20 сообщений появится |
|
|
|
|
I_Wanna_Know |
5.9.2014, 23:12
Сообщение
#9
|
|
Студент ![]() Группа: Участник Сообщений: 20 Регистрация: 28.8.2014 Пользователь №: 4213 Спасибо сказали: 0 раз(а) Репутация: 0
|
Спасибо всем за ответы пожалуй я действительно буду пытаться постигать QGraphicsScene и QGraphicsView, мне он кажутся по цивильнее
И ещё, чтобы не плодить темы спрошу тут: Подскажите пожалуйста, возможно ли "скрестить" Qt+Visual Studio чтобы можно было пользоваться Visual Studio дебажа Qt проект и использовать инструмент визуалки "карта кода"(очень удобная вещь), если да то как? |
|
|
|
|
Litkevich Yuriy |
6.9.2014, 10:14
Сообщение
#10
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94
|
Цитата(I_Wanna_Know @ 6.9.2014, 2:12) Link И ещё, чтобы не плодить темы спрошу тут: Правило: в одной теме решается только одна проблема |
|
|
|
![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 26.12.2025, 23:07 |