Оптимизация четырехъядерного рендеринга OpenGL

Я рисую квадроциклы в openGL. Мой вопрос в том, есть ли какой-либо дополнительный прирост производительности от этого:

// Method #1

glBegin(GL_QUADS);
// Define vertices for 10 quads
glEnd();

... над выполнением этого для каждого из 10 квадроциклов:

// Method #2

glBegin(GL_QUADS);
// Define vertices for first quad
glEnd();

glBegin(GL_QUADS);
// Define vertices for second quad
glEnd();

//etc...

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


person Kevin Laity    schedule 12.07.2009    source источник


Ответы (6)


Да, первый быстрее, потому что каждый вызов glBegin или glEnd изменяет состояние OpenGL.

Однако даже лучше, чем один вызов glBegin и glEnd (если у вас значительное количество вершин), передать все ваши вершины с помощью glVertexPointer (и другие), а затем сделайте один вызов glDrawArrays или glDrawElements. Это отправит все ваши вершины в GPU одним махом, а не постепенно, путем многократного вызова glVertex3f.

person Jesse Beder    schedule 12.07.2009

С точки зрения накладных расходов на вызовы функций второй подход является более затратным. Если бы вместо десяти квадов мы использовали десять тысяч. Тогда glBegin/glEnd будет вызываться десять тысяч раз за кадр вместо одного.

Что еще более важно, glBegin/glEnd устарели, начиная с OpenGL 3.0, и не поддерживаются OpenGL ES.

Вместо этого вершины загружаются в виде массивов вершин с использованием таких вызовов, как glDrawArrays. Учебник и другую подробную информацию можно найти на сайте NeHe.

person Adaptation    schedule 12.07.2009

Я решил пойти дальше и протестировать его, используя цикл из 10 000 квадов.

Результаты, достижения:

Метод 1: 0,0128 секунды

Метод 2: 0,0132 секунды

Метод №1 имеет некоторые улучшения, но очень незначительные (3%). Вероятно, это не более чем накладные расходы на простой вызов дополнительных функций. Так что вполне вероятно, что сам OpenGL не получает никакой дополнительной оптимизации от метода № 1.

Это в пакете обновления 3 для Windows XP с использованием OpenGL 2.0 и Visual Studio 2005.

person Kevin Laity    schedule 12.07.2009
comment
Как вы это сравнивали? Сравнивать вызовы OpenGL очень сложно — просто установка таймера до и после вызовов не обязательно учитывает отправку данных на графический процессор, любые вычисления на графическом процессоре и рендеринг. - person Jesse Beder; 13.07.2009
comment
В данном случае меня интересует только то, сколько времени уходит на подвешивание темы, в которой я нахожусь. Если мой таймер срабатывает после вызова кода, то, с моей точки зрения, столько времени занимает OpenGL. На предыдущем движке, с которым я работал, мы имели дело с миллионом маленьких текстур, что означало миллион вызовов текстур, что приводило к замедлению наших игр. Я просто хочу удостовериться, что мы не тратим время OpenGL впустую, меня не волнует его внутренняя работа, потому что я не могу этого изменить! - person Kevin Laity; 13.07.2009
comment
И предположение, которое я делаю, заключается в том, что после того, как я закончу общаться с OpenGL, он достаточно умен, чтобы оптимизировать все, что я дал для отправки на видеокарту, это ложное предположение? - person Kevin Laity; 13.07.2009

Я считаю, что ответ положительный, но вы должны попробовать сами. Напишите что-нибудь, чтобы нарисовать 100 000 квадроциклов, и посмотрите, будет ли это намного быстрее. Тогда отпишитесь о результатах здесь :)

Шнаадер: В документе, который вы читаете, имеется в виду, что у вас не должно быть кода, не связанного с gl, между glBegin и glEnd. Они не означают, что вы должны вызывать его несколько раз, а не короткими битами.

person Jameson    schedule 12.07.2009
comment
Спасибо за ваш ответ, мои результаты опубликованы в ответе ниже :) - person Kevin Laity; 12.07.2009

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

person pmr    schedule 12.07.2009

Вы наверняка получите лучшую производительность, если узнаете, сколько кода вызывается процессором.

Независимо от того, будет ли ваша производительность рисования на графическом процессоре лучше, это будет полностью зависеть от реализации драйвера для вашей 3D-видеокарты. Вы можете получить потенциально совершенно разные результаты с драйвером другого производителя и даже с другой версией драйвера для одной и той же карты.

person Jim Buck    schedule 13.07.2009