Russian Qt Forum
Ноябрь 23, 2024, 08:16
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Пользовательский интерфейс (GUI)
>
QGLWidget - потеря буфера на Вындоуз
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QGLWidget - потеря буфера на Вындоуз (Прочитано 10759 раз)
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
QGLWidget - потеря буфера на Вындоуз
«
:
Июнь 29, 2014, 12:53 »
Добрый день
Откомпилите и запустите аттач. Потаскайте окно так чтобы часть его оказалась вне экрана и обратно, перекройте его окном др приложения и снова наверх. При этом paintEvent НЕ вызывается (см хоть визуально хоть в консоли) . Хотя Вындоуз не имеет double-buffer, но Qt его делает, cпасибо
Теперь замените в дефайне QWidget на QGLWidget - увы, теперь любое перекрытие вызывает перерисовку на Вындоуз Qt 5.2
При большом кол-ве рисуемой геометрии это очень болезненно.
Thoughts ?
Записан
Hrundel
Гость
Re: QGLWidget - потеря буфера на Вындоуз
«
Ответ #1 :
Июнь 30, 2014, 10:27 »
А разве это не аппаратная перерисовка OpenGL? По моему это где-то отключается. Правда не знаю точно. Опыта с GL не много.
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: QGLWidget - потеря буфера на Вындоуз
«
Ответ #2 :
Июнь 30, 2014, 11:58 »
Я только начинаю изучать GL. Но мне видется такой вариант: писать изображение в передний и задний буфер, а при попытке перерисовки делать swap и копировать информацию из переднего в задний.
Возможно, сказал ерунду, но я пытался помочь
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QGLWidget - потеря буфера на Вындоуз
«
Ответ #3 :
Июнь 30, 2014, 14:12 »
Цитата: Hrundel от Июнь 30, 2014, 10:27
А разве это не аппаратная перерисовка OpenGL? По моему это где-то отключается. Правда не знаю точно. Опыта с GL не много.
Что-то в стиле
Верес
а (одна бабушка сказала ..
)
Цитата: __Heaven__ от Июнь 30, 2014, 11:58
Я только начинаю изучать GL. Но мне видется такой вариант: писать изображение в передний и задний буфер, а при попытке перерисовки делать swap и копировать информацию из переднего в задний.
Возможно, сказал ерунду, но я пытался помочь
После того как произошел swapBuffers и экран обновлен - содержимое второго буфера не определено, это точно. Когда-то я пробовал читать передний буфер (glReadPixels) чтобы содрать (перекрытую) картинку - получалось. Но на gamedev мне сказали что это не гарантируется.
По теме: данный конкретный пример решается просто: достаточно поставить WA_PaontOnScreen = false для QGLWidget. Но увы, это бычит только когда он "окно" (parent = 0, Qt::Window). Если же он вставлен в окно - никак. Корячился 2 дня, по исходникам вижу - глухо. Написал в ихний баг репорт, а сам порезал исходники (не дожидаясь перитонита). Хреново, а шо делать ?
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: QGLWidget - потеря буфера на Вындоуз
«
Ответ #4 :
Июнь 30, 2014, 15:46 »
А как насчёт вести запись всех графических объектов в какой-нибудь image и при перерисовке выводить на экран одного его, а на 10
9
объектов?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QGLWidget - потеря буфера на Вындоуз
«
Ответ #5 :
Июнь 30, 2014, 17:48 »
Цитата: __Heaven__ от Июнь 30, 2014, 15:46
А как насчёт вести запись всех графических объектов в какой-нибудь image и при перерисовке выводить на экран одного его, а на 10
9
объектов?
C OpenGL этот подход не катит, не будет он просто так в имедж рендерить (нужно городить типа FBO). Ну и рендер "объект за объектом" совсем не равен "рендеру сцены" (перекрытия и.т.п.)
Записан
Hrundel
Гость
Re: QGLWidget - потеря буфера на Вындоуз
«
Ответ #6 :
Июнь 30, 2014, 19:32 »
Ну, почему!? Скриншот вьюпорта сделать очень даже можно. И огород не большой. Где-то у меня даже такой код валяется. В нете точно можно найти. Например
здесь
Тебе же в этом случае не нужен полноценный рендер? Или я тебя неправильно понял?
«
Последнее редактирование: Июнь 30, 2014, 19:37 от Hrundel
»
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: QGLWidget - потеря буфера на Вындоуз
«
Ответ #7 :
Июнь 30, 2014, 23:17 »
Цитата: Igors от Июнь 30, 2014, 17:48
Цитата: __Heaven__ от Июнь 30, 2014, 15:46
А как насчёт вести запись всех графических объектов в какой-нибудь image и при перерисовке выводить на экран одного его, а на 10
9
объектов?
C OpenGL этот подход не катит, не будет он просто так в имедж рендерить (нужно городить типа FBO). Ну и рендер "объект за объектом" совсем не равен "рендеру сцены" (перекрытия и.т.п.)
Я тему до конца не изучил, но знаю, что в GL есть какие-то левый и правый буферы ещё. Если они тоже как-то работают с цветами, то их, возможно тоже можно как-то задействовать. Мне кажется, что в любом случае у вас должна быть под рукой дублирующая картинка, которую можно потом оперативно вставить.
А как насчёт использования чистого OpenGL? glBegin(QL_QUADS), glVertex? Мне удавалось прорисовать огромное количество треугольников за сравнительно малое время. Мне кажется, что прямое использование OpenGL должно дать значительный прирост производительности. Может быть, скорость полной перерисовки вас устроит при таком подходе.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QGLWidget - потеря буфера на Вындоуз
«
Ответ #8 :
Июль 01, 2014, 11:50 »
Цитата: Hrundel от Июнь 30, 2014, 19:32
Ну, почему!? Скриншот вьюпорта сделать очень даже можно. И огород не большой. Где-то у меня даже такой код валяется. В нете точно можно найти. Например
здесь
Тебе же в этом случае не нужен полноценный рендер? Или я тебя неправильно понял?
У меня рендер один, полноценный или нет - судить пользователю. Насколько я помню glReadPixeks не катит для контекста с AA
[/off]Вы там преподу говорите "du"? Сомневаюсь, наверное все-таки "Sie". А здесь типа "отдыхаете в родной среде"
Цитата: __Heaven__ от Июнь 30, 2014, 23:17
А как насчёт использования чистого OpenGL? glBegin ...
Так это без разницы - рендер одинаковы с GLWidget и без. Вызовы GL одинаковы, одна и та же карта рендерит с той же скоростью. Qt очень удобен для создания контекста - руками это капитальный геморрой на каждой платформе.
Цитата: __Heaven__ от Июнь 30, 2014, 23:17
Я тему до конца не изучил, но знаю, что в GL есть какие-то левый и правый буферы ещё. Если они тоже как-то работают с цветами, то их, возможно тоже можно как-то задействовать. Мне кажется, что в любом случае у вас должна быть под рукой дублирующая картинка, которую можно потом оперативно вставить.
В примере что я запостил установите флажок WA_PaintOnScreen = false для QGLWidget и увидите что Qt уже делает то что надо. Поэтому в данном случае надо не городить велосипед, а заставить либу работать
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: QGLWidget - потеря буфера на Вындоуз
«
Ответ #9 :
Июль 01, 2014, 11:52 »
Получил ответ от Qt
Цитировать
You could change your QGLWidgets to be QWindow with a QOpenGLContext inside them using
QWidget::createWindowContainer().
Хммм.... пытаюсь осмыслить
Записан
Hrundel
Гость
Re: QGLWidget - потеря буфера на Вындоуз
«
Ответ #10 :
Июль 01, 2014, 12:46 »
Цитата: Igors от Июль 01, 2014, 11:50
[/off]Вы там преподу говорите "du"? Сомневаюсь, наверное все-таки "Sie". А здесь типа "отдыхаете в родной среде"
[off]Для меня "du" - это способ выражения доверия и дружелюбия по отношению к собеседнику. Я не раздуваю собственную важность ставя кого-то на уровень ниже себя. И не умаляю себя - ставя кого-то выше себя. Общение на ты, является для меня показателем равности говорящих. Надеюсь, это тебя не травмирует?
Кроме того, по возрасту я приближаюсь к пятидесяти, поэтому позволяю себе общаться с младшими на ты. Если тебя удивляет, что учусь - то, все просто, это второе высшее образование. Просто, решил сделать хобби своей профессией. И кстати, с двумя профессорами я тоже на ты.[/off]
«
Последнее редактирование: Июль 01, 2014, 13:39 от Hrundel
»
Записан
vulko
Гость
Re: QGLWidget - потеря буфера на Вындоуз
«
Ответ #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
Сообщений: 11445
Re: QGLWidget - потеря буфера на Вындоуз
«
Ответ #12 :
Июль 18, 2014, 14:29 »
Цитата: vulko от Июль 18, 2014, 14:06
эээ... ооо.... ыыы... это в школе джедаев такой х**те учат?
прежде чем писать много много букаф, лучше немного подумать... а иногда вместо того чтобы пЕсать очередную бредятину лучше помолчать...
Совершенно верно, сначала изучите мой пример, а потом пишите - если есть что. А так, "просто хамить" - пошел вон
Записан
vulko
Гость
Re: QGLWidget - потеря буфера на Вындоуз
«
Ответ #13 :
Июль 18, 2014, 14:41 »
Цитата: Igors от Июль 18, 2014, 14:29
Совершенно верно, сначала изучите мой пример, а потом пишите - если есть что. А так, "просто хамить" - пошел вон
пафос засунь себя подальше в зад, удали свой говно пример навсегда!
потом изучи как работает qglwidget и не плоди тупые темы на форуме.
или ты думаешь что если написать какую-то хрень, ни задать конкретного вопроса, ни описать конкретную задачу, а в конце добавить "Thoughts?" (это типа круто? типа инглиш преинтермидиэйт бесплатные курсы прошел?)))), можно получить какой-то ответ?
Записан
__Heaven__
Джедай : наставник для всех
Offline
Сообщений: 2130
Re: QGLWidget - потеря буфера на Вындоуз
«
Ответ #14 :
Июль 18, 2014, 15:12 »
vulko
, а вы откорректируйте пример под необходимы результат, как считаете правильным...
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...