2014-11-11 5 views
1

Контекст: Я измеряю использование процессора во время графического рендеринга приложения Qt test. Отрисовка выполняется через модуль Qt Quick, который использует выделенный граф сцены на основе OpenGL.Использование ЦП в glFinish()

Окружающая среда: Я запускаю тесты на мобильной панели под управлением Windows CE, и я отслеживаю активность процессора с помощью отслеживания событий Celog.

Задача: Когда QQuickWindow излучает сигналы afterRendering() и frameSwapped(), я вызываю функцию glFinish(). Поскольку задача glFinish() состоит в том, чтобы дождаться завершения всех предыдущих команд opengl, я понимаю, что CPU должен просто ждать, пока GPU выполнит задачи. И поэтому я ожидал, что во время этого вызова будет очень мало использования ЦП. Однако это не то, что я наблюдаю с помощью трекера celog. Я могу заметить, что во время таймфрейма glFinish() некоторые потоки, принадлежащие тестовому приложению, все еще используют CPU. И в конечном итоге использование ЦП в том же диапазоне, что и остальная часть цикла рендеринга.

Так что мне было интересно, есть ли объяснение используемому процессору, когда работает glFinish()?

+1

Я не могу говорить для Windows CE, но я знаю, что драйверы, работающие на простой старой Windows с использованием графического процессора от AMD или nVidia, многопоточны. Они будут генерировать несколько потоков _usermode_ в вашем процессе, чтобы обрабатывать всевозможные вещи для OpenGL, такие как преобразование данных, планирование команд и т. Д. Вы обнаружите, что это рано или поздно будет развиваться в Windows, когда поток, который вы не имеете ничего общего с причинами авария в некоторых AMD или nVidia DLL: P У вас есть какой-то способ узнать, какая DLL создала эти потоки? –

+0

Да, у меня есть очень подробная информация о файле Celog, и я могу сказать, что соответствующие потоки были созданы в процессе тестового приложения. Чтобы быть более конкретным, тестовое приложение создает 3 потока, причем только один из них действительно активен. Этот поток использует процессор на каждом шаге цикла рендеринга, включая эту функцию glFinish. – martinni

ответ

0

OpenGL использует асинхронную модель исполнения. Команды OpenGL помещаются в очередь в конвейере команд рендеринга, и конвейер может вообще не выполняться, а команды в очереди остаются бездействующими до тех пор, пока выполнение трубопровода не будет принудительно выполнено , промывая конвейер с помощью glFlush или создавая синхронизирующий вызов OpenGL, который вызывает неявный флеш и ждать, как glFinish (или …SwapBuffers).

Следовательно, не удивительно, если что-то происходит на процессоре и графическом процессоре после звонка на glFlush.

+0

Хорошо, я понимаю, что все занят на графическом процессоре, так как ему приходится иметь дело со всеми командами OpenGL, стоящими в очереди. Но не должен ли процессор находиться в состоянии ожидания во время ожидания GPU? Я имею в виду, я думал, что команды OpenGL работают в основном на GPU, я не прав? – martinni

Смежные вопросы