Оптимизация рендеринга OpenGL quad



Я рисую квадроциклы в 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...

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

182   6  

6 ответов:

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

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

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

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

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

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

Результаты:

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

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

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

Это на Windows XP service pack 3 с использованием OpenGL 2.0 и visual studio 2005.

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

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

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

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

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

    Ничего не найдено.

Добавить ответ:
Отменить.