2009-12-27 3 views
4

В приложении, которое связано с GPU, мне интересно, в какой момент процессор будет ждать GPU для завершения рендеринга. Различие между DirectX и OpenGL?Когда процессор ожидает на GPU?

Выполнение примера, аналогичного приведенному ниже, очевидно, что процессор не убегает - и, глядя в диспетчере задач, использование ЦП (если это была одноядерная машина) было бы ниже 100%.

While (running){ 

    Clear(); 

    SetBuffers(); // Vertex/Index 

    SetTexture(); 

    DrawPrimitives(); 

    Present(); 
} 
+0

Не могу ответить на этот вопрос, не зная, о какой ОС вы спрашиваете о –

+0

Это будет Windows XP –

ответ

4

Краткое описание состоит в том, что вы, вероятно, увидите ожидание в Present(), но это действительно зависит от того, что это вызов Present().

Как правило, если вы специально не заявляете, что хотите получить уведомление о завершении работы графического процессора, вы можете в ожидании на (случайной для вас) точки заполнения входного буфера драйвера. Подумайте о драйвере GPU & карта как очень длинный трубопровод. Вы можете работать на одном конце, и через некоторое время он появляется на дисплее. Возможно, вам удастся добавить в конвейер несколько команд, чтобы они заполнили. На карточке может быть много времени рисования примитивов, но вы можете увидеть, что процессор ждет несколько секунд в нескольких точках.

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

Я надеюсь, что следующее может быть полезным:

Clear(); 

Вызывает все пиксели в текущем буфере, чтобы изменить цвет, поэтому GPU делает работу. Посмотрите, какая скорость занимает у вашего процессора чистую пик/сек. .

SetBuffers(); 
SetTexture(); 

Водитель может сделать какую-то работу здесь, но в целом она хочет ждать, пока вы на самом деле рисунок, чтобы использовать эти новые данные. В любом случае, GPU не делает здесь .

DrawPrimitives(); 

Теперь здесь где ГПУ должна делать большую часть работы. В зависимости от размера примитива вы будете ограничены вершинами/сек или пикселями в секунду. Возможно, у вас есть дорогой шейдер, который вы будете ограничены инструкциями шейдеров/сек.

Однако вы не можете видеть это как место, в котором находится процессор. Драйвер может буферизировать команды для вас, и процессор может продолжить работу.

Present(); 

На данный момент работа ГПУ минимальна. Он просто меняет указатель на запуск отображения из другого буфера.

Однако, вероятно, это то, что появляется, чтобы процессор находился там, где он ждет на GPU.В зависимости от вашего API «Present()» может включать что-то вроде glFlush() или glFinish(). Если да, то вы, вероятно, будете ждать здесь.

0

В Windows ожидания находятся в видеодрайвере. Они в значительной степени зависят от внедрения драйверов, хотя во многих случаях необходимость ожидания зависит от требований используемого API (независимо от того, определены ли вызовы синхронно или нет).

Да, это, скорее всего, будет отличаться от DirectX и OpenGL.

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