Оптимизация Quad рендеринга OpenGL - PullRequest
4 голосов
/ 12 июля 2009

Я рисую четверки в 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...

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

Ответы [ 6 ]

10 голосов
/ 12 июля 2009

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

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

4 голосов
/ 12 июля 2009

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

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

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

3 голосов
/ 12 июля 2009

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

Результаты:

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

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

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

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

2 голосов
/ 12 июля 2009

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

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

0 голосов
/ 13 июля 2009

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

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

0 голосов
/ 12 июля 2009

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

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