Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Igors от Июнь 29, 2014, 12:53



Название: QGLWidget - потеря буфера на Вындоуз
Отправлено: Igors от Июнь 29, 2014, 12:53
Добрый день

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

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

Thoughts ?


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: Hrundel от Июнь 30, 2014, 10:27
А разве это не аппаратная перерисовка OpenGL? По моему это где-то отключается. Правда не знаю точно. Опыта с GL не много.


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: __Heaven__ от Июнь 30, 2014, 11:58
Я только начинаю изучать GL. Но мне видется такой вариант: писать изображение в передний и задний буфер, а при попытке перерисовки делать swap и копировать информацию из переднего в задний.
Возможно, сказал ерунду, но я пытался помочь


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: Igors от Июнь 30, 2014, 14:12
А разве это не аппаратная перерисовка OpenGL? По моему это где-то отключается. Правда не знаю точно. Опыта с GL не много.
Что-то в стиле Вереса (одна бабушка сказала .. :))

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

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


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: __Heaven__ от Июнь 30, 2014, 15:46
А как насчёт вести запись всех графических объектов в какой-нибудь image и при перерисовке выводить на экран одного его, а на 109 объектов?


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: Igors от Июнь 30, 2014, 17:48
А как насчёт вести запись всех графических объектов в какой-нибудь image и при перерисовке выводить на экран одного его, а на 109 объектов?
:)  C OpenGL этот подход не катит, не будет он просто так в имедж рендерить (нужно городить типа FBO). Ну и рендер "объект за объектом" совсем не равен "рендеру сцены" (перекрытия и.т.п.)


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: Hrundel от Июнь 30, 2014, 19:32
Ну, почему!? Скриншот вьюпорта сделать очень даже можно. И огород не большой. Где-то у меня даже такой код валяется. В нете точно можно найти. Например  здесь  (http://wiki.delphigl.com/index.php/Screenshot)
Тебе же в этом случае не нужен полноценный рендер? Или я тебя неправильно понял?


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: __Heaven__ от Июнь 30, 2014, 23:17
А как насчёт вести запись всех графических объектов в какой-нибудь image и при перерисовке выводить на экран одного его, а на 109 объектов?
:)  C OpenGL этот подход не катит, не будет он просто так в имедж рендерить (нужно городить типа FBO). Ну и рендер "объект за объектом" совсем не равен "рендеру сцены" (перекрытия и.т.п.)

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


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: Igors от Июль 01, 2014, 11:50
Ну, почему!? Скриншот вьюпорта сделать очень даже можно. И огород не большой. Где-то у меня даже такой код валяется. В нете точно можно найти. Например  здесь  (http://wiki.delphigl.com/index.php/Screenshot)
Тебе же в этом случае не нужен полноценный рендер? Или я тебя неправильно понял?
У меня рендер один, полноценный или нет - судить пользователю. Насколько я помню glReadPixeks не  катит для контекста с AA

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

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

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


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: Igors от Июль 01, 2014, 11:52
Получил ответ от Qt

Цитировать
You could change your QGLWidgets to be QWindow with a QOpenGLContext inside them using
QWidget::createWindowContainer().
Хммм.... пытаюсь осмыслить  :)


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: Hrundel от Июль 01, 2014, 12:46
[/off]Вы там преподу говорите "du"? Сомневаюсь, наверное все-таки "Sie". А здесь типа "отдыхаете в родной среде"  :)

[off]Для меня "du" - это способ выражения доверия и дружелюбия по отношению к собеседнику. Я не раздуваю собственную важность ставя кого-то на уровень ниже себя. И не умаляю себя - ставя кого-то выше себя. Общение на ты, является для меня показателем равности говорящих. Надеюсь, это тебя не травмирует?  ;) Кроме того, по возрасту я приближаюсь к пятидесяти, поэтому позволяю себе общаться с младшими на ты. Если тебя удивляет, что учусь - то, все просто, это второе высшее образование. Просто, решил сделать хобби своей профессией. И кстати, с двумя профессорами я тоже на ты.[/off]


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: vulko от Июль 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() метод.


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: Igors от Июль 18, 2014, 14:29
эээ... ооо.... ыыы... это в школе джедаев такой х**те учат?
прежде чем писать много много букаф, лучше немного подумать... а иногда вместо того чтобы пЕсать очередную бредятину лучше помолчать...
Совершенно верно, сначала изучите мой пример, а потом пишите - если есть что. А так, "просто хамить" - пошел вон



Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: vulko от Июль 18, 2014, 14:41
Совершенно верно, сначала изучите мой пример, а потом пишите - если есть что. А так, "просто хамить" - пошел вон

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

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


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: __Heaven__ от Июль 18, 2014, 15:12
vulko, а вы откорректируйте пример под необходимы результат, как считаете правильным...


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: Igors от Июль 18, 2014, 16:03
vulko, а вы откорректируйте пример под необходимы результат, как считаете правильным...
Конечно дело Ваше, но мне кажется Вы допускаете типичную ошибку: пытаетесь разговаривать с хамом "по существу". Люди c большим ртом обладают очень маленьким умом, ничего (кроме очередного хамства) Вы от него не дождетесь. Не тратьте попусту время и слова, подождем пока его забанят (а с его темпами это случится скоро)


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: vulko от Июль 21, 2014, 08:04
vulko, а вы откорректируйте пример под необходимы результат, как считаете правильным...

с такой постановкой вопроса необходимый результат неясен...

впрочем если речь идет о ручном контроле отрисовки, то у qglwidget'а есть методы paintGL() - собсно отрисовка и updateGL() - вызов отрисовки.

по поводу вставки в окно... для того чтобы вставить в окно совсем не обязательно задавать родителя parent'ом, можно просто впихнуть его в layout.

Цитировать
Конечно дело Ваше, но мне кажется Вы допускаете типичную ошибку: пытаетесь разговаривать с хамом "по существу". Люди c большим ртом обладают очень маленьким умом, ничего (кроме очередного хамства) Вы от него не дождетесь. Не тратьте попусту время и слова, подождем пока его забанят (а с его темпами это случится скоро)

очень маленьким умом обычно обладают люди которые много чешут (пишут) языком (на форумах) без дела и вокруг да около, а также плодят дурацкие темы в стиле "как прострелить себе ногу" (с) из соседней темы ;)


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: Bepec от Июль 21, 2014, 12:33
В чем я согласен - так в том, что Igors ставит задачу без четких рамок уже в который раз. Т.е. с ним разговаривать в этих темах бесполезно - ты ему про тему, а он тебе про коня :D

А вот грубить - последнее дело :/


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: Igors от Июль 22, 2014, 12:37
В чем я согласен - так в том, что Igors ставит задачу без четких рамок уже в который раз. Т.е. с ним разговаривать в этих темах бесполезно - ты ему про тему, а он тебе про коня :D
"Видите какие длинные руки - свисают ниже колен!". А может руки нормальные, просто ноги короткие?  :) Придирки "к постановке" начинаются когда нет ответа из букваря, и некоторых это раздражает (хз почему)

В то что Qt кеширует отрисовки на Вындоуз верится легко даже при беглом просмотре исходников, напр имя класса QBackingStore прозрачно намекает. А немного покопавшись можно найти вызов BitBlt выводящий кеш на экран. А можно просто проверить запустив мой пример. Проблема в том что это кеширование не срабатывает когда оно больше всего нужно (QGLWidget). Вот собственно и все.

Bepec, что Вам непонятно? :) (тем более это на Вашей платформе). Как Вы представляете себе "четкие рамки" чтобы Вы (наконец-то) смогли говорить полезно? :)


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: Bepec от Июль 22, 2014, 12:38
Четко ответить можно только на четко поставленный вопрос. На нечеткий вопрос ответ хранится только в дурной голове задающего :)


Название: Re: QGLWidget - потеря буфера на Вындоуз
Отправлено: vulko от Июль 22, 2014, 15:00
прямо п****бол 80 левела...

а может очки кривые или перепил, оттого и руки длинные? а может баскетболист?
это можно продолжать бесконечно. когда человек сам не понимает что он хочет или не умеет выражать свои мысли в нормальные слова, помочь ему нереально.


вспомнил анекдот про инженеров, которым дали задачу сделать масло из говна.
через пару месяцев пришли и спрашивают:
- ну как успехи.
- на 50% задачу решили!
- это как?
- ну... на хлеб уже намазывается!


Цитировать
В то что Qt кеширует отрисовки на Вындоуз верится легко даже при беглом просмотре исходников, напр имя класса QBackingStore прозрачно намекает. А немного покопавшись можно найти вызов BitBlt выводящий кеш на экран. А можно просто проверить запустив мой пример. Проблема в том что это кеширование не срабатывает когда оно больше всего нужно (QGLWidget). Вот собственно и все.

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

в gl'е всегда есть front и back буферы. front всегда отображается, back заполняется и swap'ается с front'ом. таким образом картинка меняется.

qglcontext и qglformat в помощь ;)