Отображение прогресса вычислений gl в qt - PullRequest
5 голосов
/ 24 августа 2011

У меня есть процесс, который выполняет некоторые сложные математические операции с gl, а не с процессором (gl / gpu до сих пор работает примерно в 100 раз быстрее, чем процессор), но все же это примерно минута, чтобы обычные размеры задач были готовы, поэтому яЯ хотел получить хороший индикатор выполнения, чтобы знать, сколько времени это займет.

Поэтому я настроил свои классы на наследование от QObject и получаю сигнал currentProgress(int), который посылается время от времени.К сожалению, моя программа зависает во время расчета, поэтому никакого прогресса не видно.Я нашел решение в вызове QCoreApplication::processEvents(), что дало мне еще одну проблему.Во время этого вызова запускается перерисовка всего окна, в результате чего мой расчет вызывается в бесконечной рекурсии, потому что он сам запускается событием рисования.

Теперь все эти проблемы являются сигналами, которые говорят моей интуиции программированияслот, в котором я, вероятно, что-то неправильно спроектировал, поэтому я спрашиваю вас, как по умолчанию использовать обновленную строку прогресса в qt?

Также обратите внимание: когда я хочу перенести вычисления в другой поток, мне, вероятно, нужно создатьновый контекст GL или, по крайней мере, переместить существующий.Так что, если это путь, может кто-нибудь объяснить мне, как достичь этого в qt?

РЕДАКТИРОВАТЬ

Чтобы прояснить ситуацию, я не обращаю кQGLWidget, но с использованием FBO.Возможно, лучше всего использовать собственный контекст для расчетов, но я не знаю, правильный ли это путь.

Новая информация

Так что япытался последовать твоему совету, но наткнулся на проблему.QGLContext, похоже, был подключен к объекту screen / gui, поэтому я не могу создать один закадровый.

Кроме того, я не могу сделать ток QGLWidget в других потоках.Он возвращает ошибку QGLContext::makeCurrent(): Failed. Далее все записи, о которых я читал, были людьми с такой же проблемой, как и я: они хотели сделать рендеринг в другом потоке и не нашли решения.

Ответы [ 3 ]

3 голосов
/ 24 августа 2011

Во время этого вызова запускается перекраска всего окна, в результате чего мои вычисления вызываются бесконечной рекурсией, потому что они сами запускаются событием рисования.

Тогда вам не следует запускать вычисления в событии рисования. Если окно является окном OpenGL (то есть: объект GPGPU рендерится в окно), то вы должны скрыть его на время вычислений. Если это не окно OpenGL, то его обновление не должно провоцировать вычисления.

Если вы не используете OpenGL для рисования чего-либо, вы должны использовать цель рендеринга за пределами экрана. По сути, вы создаете окно GL, затем создаете новый контекст, который совместно использует объекты с этим, используя WGL_ARB_pbuffers (или эквивалент GLX, в зависимости от вашей системы графического интерфейса). Это цель закадрового рендера. Затем вы уничтожаете исходное окно.

Что касается потоков, не забывайте: даже если у вас два контекста GL, у вас есть только один графический процессор. Поэтому, если вы используете OpenGL для рисования в окне и OpenGL для выполнения некоторых вычислений, это может не сработать.

2 голосов
/ 24 августа 2011

Да, если поместить это в собственную ветку, это путь.QGLWidget предоставляет следующие функции-члены:

void QGLWidget::makeCurrent()
void QGLWidget::doneCurrent()

Соответствующий вызов их из потока обработки.setUpdatesEnables(false); не позволяет обычной обработке сигнала вызвать перерисовку.

Кстати: знаю ли я вас из группы новостей comp.graphics.api.opengl ?Там тоже есть "Никто".Взгляните на мой профиль пользователя, чтобы узнать, кто я там.

2 голосов
/ 24 августа 2011

A setUpdatesEnabled (false); в виджете рисования может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...