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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QGLWidget - потеря буфера на Вындоуз  (Прочитано 10164 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Июнь 29, 2014, 12:53 »

Добрый день

Откомпилите и запустите аттач. Потаскайте окно так чтобы часть его оказалась вне экрана и обратно, перекройте его окном др приложения и снова наверх. При этом paintEvent НЕ вызывается (см хоть визуально хоть в консоли) . Хотя Вындоуз не имеет double-buffer, но Qt его делает, cпасибо

Теперь замените в дефайне QWidget на QGLWidget - увы, теперь любое перекрытие вызывает перерисовку на Вындоуз Qt 5.2 Плачущий При большом кол-ве рисуемой геометрии это очень болезненно.

Thoughts ?
Записан
Hrundel
Гость
« Ответ #1 : Июнь 30, 2014, 10:27 »

А разве это не аппаратная перерисовка OpenGL? По моему это где-то отключается. Правда не знаю точно. Опыта с GL не много.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Июнь 30, 2014, 11:58 »

Я только начинаю изучать GL. Но мне видется такой вариант: писать изображение в передний и задний буфер, а при попытке перерисовки делать swap и копировать информацию из переднего в задний.
Возможно, сказал ерунду, но я пытался помочь
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июнь 30, 2014, 14:12 »

А разве это не аппаратная перерисовка OpenGL? По моему это где-то отключается. Правда не знаю точно. Опыта с GL не много.
Что-то в стиле Вереса (одна бабушка сказала .. Улыбающийся)

Я только начинаю изучать GL. Но мне видется такой вариант: писать изображение в передний и задний буфер, а при попытке перерисовки делать swap и копировать информацию из переднего в задний.
Возможно, сказал ерунду, но я пытался помочь
После того как произошел swapBuffers и экран обновлен - содержимое второго буфера не определено, это точно. Когда-то я пробовал читать передний буфер (glReadPixels) чтобы содрать (перекрытую) картинку - получалось. Но на gamedev мне сказали что это не гарантируется.

По теме: данный конкретный пример решается просто: достаточно поставить WA_PaontOnScreen = false для QGLWidget. Но увы, это бычит только когда он "окно" (parent = 0, Qt::Window). Если же он вставлен в окно - никак. Корячился 2 дня, по исходникам вижу - глухо. Написал в ихний баг репорт, а сам порезал исходники (не дожидаясь перитонита). Хреново, а шо делать ?  Плачущий
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Июнь 30, 2014, 15:46 »

А как насчёт вести запись всех графических объектов в какой-нибудь image и при перерисовке выводить на экран одного его, а на 109 объектов?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июнь 30, 2014, 17:48 »

А как насчёт вести запись всех графических объектов в какой-нибудь image и при перерисовке выводить на экран одного его, а на 109 объектов?
Улыбающийся  C OpenGL этот подход не катит, не будет он просто так в имедж рендерить (нужно городить типа FBO). Ну и рендер "объект за объектом" совсем не равен "рендеру сцены" (перекрытия и.т.п.)
Записан
Hrundel
Гость
« Ответ #6 : Июнь 30, 2014, 19:32 »

Ну, почему!? Скриншот вьюпорта сделать очень даже можно. И огород не большой. Где-то у меня даже такой код валяется. В нете точно можно найти. Например здесь
Тебе же в этом случае не нужен полноценный рендер? Или я тебя неправильно понял?
« Последнее редактирование: Июнь 30, 2014, 19:37 от Hrundel » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #7 : Июнь 30, 2014, 23:17 »

А как насчёт вести запись всех графических объектов в какой-нибудь image и при перерисовке выводить на экран одного его, а на 109 объектов?
Улыбающийся  C OpenGL этот подход не катит, не будет он просто так в имедж рендерить (нужно городить типа FBO). Ну и рендер "объект за объектом" совсем не равен "рендеру сцены" (перекрытия и.т.п.)

Я тему до конца не изучил, но знаю, что в GL есть какие-то левый и правый буферы ещё. Если они тоже как-то работают с цветами, то их, возможно тоже можно как-то задействовать. Мне кажется, что в любом случае у вас должна быть под рукой дублирующая картинка, которую можно потом оперативно вставить.
А как насчёт использования чистого OpenGL? glBegin(QL_QUADS), glVertex? Мне удавалось прорисовать огромное количество треугольников за сравнительно малое время. Мне кажется, что прямое использование OpenGL должно дать значительный прирост производительности. Может быть, скорость полной перерисовки вас устроит при таком подходе.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Июль 01, 2014, 11:50 »

Ну, почему!? Скриншот вьюпорта сделать очень даже можно. И огород не большой. Где-то у меня даже такой код валяется. В нете точно можно найти. Например здесь
Тебе же в этом случае не нужен полноценный рендер? Или я тебя неправильно понял?
У меня рендер один, полноценный или нет - судить пользователю. Насколько я помню glReadPixeks не  катит для контекста с AA

[/off]Вы там преподу говорите "du"? Сомневаюсь, наверное все-таки "Sie". А здесь типа "отдыхаете в родной среде"  Улыбающийся

А как насчёт использования чистого OpenGL? glBegin ...
Так это без разницы - рендер одинаковы с GLWidget и без. Вызовы GL одинаковы, одна и та же карта рендерит с той же скоростью. Qt очень удобен для создания контекста - руками это капитальный геморрой на каждой платформе.   

Я тему до конца не изучил, но знаю, что в GL есть какие-то левый и правый буферы ещё. Если они тоже как-то работают с цветами, то их, возможно тоже можно как-то задействовать. Мне кажется, что в любом случае у вас должна быть под рукой дублирующая картинка, которую можно потом оперативно вставить.
В примере что я запостил установите флажок WA_PaintOnScreen = false для QGLWidget и увидите что Qt уже делает то что надо. Поэтому в данном случае надо не городить велосипед, а заставить либу работать
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Июль 01, 2014, 11:52 »

Получил ответ от Qt

Цитировать
You could change your QGLWidgets to be QWindow with a QOpenGLContext inside them using
QWidget::createWindowContainer().
Хммм.... пытаюсь осмыслить  Улыбающийся
Записан
Hrundel
Гость
« Ответ #10 : Июль 01, 2014, 12:46 »

[/off]Вы там преподу говорите "du"? Сомневаюсь, наверное все-таки "Sie". А здесь типа "отдыхаете в родной среде"  Улыбающийся

[off]Для меня "du" - это способ выражения доверия и дружелюбия по отношению к собеседнику. Я не раздуваю собственную важность ставя кого-то на уровень ниже себя. И не умаляю себя - ставя кого-то выше себя. Общение на ты, является для меня показателем равности говорящих. Надеюсь, это тебя не травмирует?  Подмигивающий Кроме того, по возрасту я приближаюсь к пятидесяти, поэтому позволяю себе общаться с младшими на ты. Если тебя удивляет, что учусь - то, все просто, это второе высшее образование. Просто, решил сделать хобби своей профессией. И кстати, с двумя профессорами я тоже на ты.[/off]
« Последнее редактирование: Июль 01, 2014, 13:39 от Hrundel » Записан
vulko
Гость
« Ответ #11 : Июль 18, 2014, 14:06 »

Код:
Вындоуз не имеет double-buffer, но Qt его делает

эээ... ооо.... ыыы... это в школе джедаев такой х**те учат?
прежде чем писать много много букаф, лучше немного подумать... а иногда вместо того чтобы пЕсать очередную бредятину лучше помолчать...
собсно это касается всего первого поста... ни вопроса, ни привета... только ведро бредятины...

По теме:
за QGLWidget не скажу, но такое там тоже должно быть...
впрочем если нет, то:
You could change your QGLWidgets to be QWindow with a QOpenGLContext inside them using
QWidget::createWindowContainer().

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

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Июль 18, 2014, 14:29 »

эээ... ооо.... ыыы... это в школе джедаев такой х**те учат?
прежде чем писать много много букаф, лучше немного подумать... а иногда вместо того чтобы пЕсать очередную бредятину лучше помолчать...
Совершенно верно, сначала изучите мой пример, а потом пишите - если есть что. А так, "просто хамить" - пошел вон

Записан
vulko
Гость
« Ответ #13 : Июль 18, 2014, 14:41 »

Совершенно верно, сначала изучите мой пример, а потом пишите - если есть что. А так, "просто хамить" - пошел вон

пафос засунь себя подальше в зад, удали свой говно пример навсегда!
потом изучи как работает qglwidget и не плоди тупые темы на форуме.

или ты думаешь что если написать какую-то хрень, ни задать конкретного вопроса, ни описать конкретную задачу, а в конце добавить "Thoughts?" (это типа круто? типа инглиш преинтермидиэйт бесплатные курсы прошел?)))), можно получить какой-то ответ?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #14 : Июль 18, 2014, 15:12 »

vulko, а вы откорректируйте пример под необходимы результат, как считаете правильным...
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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