Ускорение рисования повернутых и масштабированных изображений в OpenGL - PullRequest
1 голос
/ 05 сентября 2011

Я экспериментирую с несколькими способами нарисовать много спрайтов (например, для системы частиц), и у меня есть некоторые неубедительные результаты.Итак, вот что я попробовал и что у меня есть: Это сделано для рисования 25 000 спрайтов:

  1. Использование обычного glBegin / glEnd и использование трига для вычисления точек вершины - 17-18fps.
  2. Используя обычные glBegin / glEnd, но используя glRotate, glTranslate и glScale для преобразования спрайта - 14-15fps.
  3. Использование массивов вершин вместо glBeginи glEnd, но по-прежнему используется триггер для вычисления положения точки вершины - 10-11fps.
  4. Использование массивов вершин вместо glBegin и glEnd, но с использованием glRotate, glTranslate и glScale для преобразования спрайта - 10-11fps.

Итак, мой вопрос: почему использование массивов вершин медленнее, чем использование glBegin / glEnd, хотя я прочитал (здесь даже), что он долженбыть быстрее?

И почему использование вашей собственной тригонометрии (которая в моем случае составляет 5 cos, 5 sin, более 5 делений, 15 умножений и около 10 сложений / вычитаний) быстрее, чем использование 5 функций (glPushMatrix(), glTranslated(), glRotated(), glScaled(), glPopMatrix()).Хотя они сделаны на GPU, так что это должно быть намного, намного быстрее .

Я получаю более многообещающие результаты, когда рисую меньше спрайтов.Например, когда я рисую 10 тыс. Спрайтов, массивы вершин могут быть примерно на 5 кадров в секунду быстрее, но все еще несовместимы.Также обратите внимание, что эти fps могут быть увеличены в целом, потому что у меня есть другие расчеты, так что я на самом деле не смотрю на сам fps, а на разницу между ними.Например, если бы массивы вершин и gl-преобразование были на 5-10 кадров в секунду больше, чем glBegin / glEnd с ручным триггером, я был бы счастлив, но сейчас это, похоже, не стоит хлопот.Они бы помогли с портированием на GLES (поскольку у него нет glBegin / glEnd), но я думаю, что я сделаю отдельную реализацию для этого.

Так есть ли способ ускорить этобез использования геометрических шейдеров?Я не совсем понимаю их (может быть, какое-то отличное учебное пособие?), И они могут нарушить совместимость со старым оборудованием, поэтому я хочу сжать весь сок, который могу, без использования шейдеров.

Ответы [ 4 ]

3 голосов
/ 05 сентября 2011

Итак, мои вопросы: почему использование массивов вершин медленнее, чем использование glBegin / glEnd, хотя я прочитал (здесь даже), что это должно быть быстрее?

Кто сказал, что они медленнее ?

Все, что вы можете сказать, это то, что для вашего конкретного оборудования, для вашего текущего драйвера, glBegin / glEnd медленнее. Вы проверяли это на другом оборудовании?

Что еще более важно, есть вопрос как вы рисуете это. Вы рисуете один спрайт из массива вершин, затем рисуете другой, затем рисуете другой? Или вы рисуете всех из них одним glDrawArrays или glDrawElements вызовом?

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

И почему использование вашей собственной тригонометрии (в моем случае это 5 cos, 5 sin, более 5 делений, 15 умножений и около 10 сложений / вычитаний) быстрее, чем использование 5 функций (glPushMatrix (), glTranslated () , glRotated (), glScaled (), glPopMatrix ()). Я думаю, что они сделаны на GPU, так что это должно быть ОЧЕНЬ быстрее.

Хорошо, давайте подумаем об этом. glPushMatrix ничего не стоит. glTranslated создает матрицу с плавающей запятой двойной точности, а затем умножает матрицу . glRotated выполняет хотя бы один грех и один cos, делает некоторые сложения и вычитания для вычисления матрицы (все с двойной точностью), а затем делает матричное умножение . glScaled вычисляет матикс, а умножает матрицу .

Каждое «умножение матрицы» состоит из 16 умножений с плавающей запятой и 12 сложений с плавающей запятой. А так как вы просили математику с двойной точностью, вы можете забыть о векторной математике SSE или о чем-либо другом; это делает стандартную математику. И вы делаете 3 из этих для каждой точки .

В графическом процессоре происходит умножение этой матрицы на позиции вершин. И поскольку перед сменой матрицы вы проходите всего 4 позиции, неудивительно, что это медленнее.

0 голосов
/ 06 сентября 2011

Есть ли у вас особая причина использовать матричные функции двойной точности?Они обычно намного медленнее, чем с одинарной точностью.

0 голосов
/ 05 сентября 2011

Вы пробовали VBO вместо этого? Это текущий стандарт, поэтому большинство карт оптимизированы в их пользу.

Также:

  • Вы должны использовать свои собственные математические вычисления
  • рассмотрите возможность выгрузить как можно больше вычислений в шейдер

Количество фпс, которое вы отправили, противоречит тому, что можно ожидать - вы, вероятно, делаете что-то не так. Можете ли вы вставить свой код рендеринга?

0 голосов
/ 05 сентября 2011

Рассматривали ли вы использование glPoints ... () вместо этого? Это как раз то, для чего они предназначены, в зависимости от того, какую версию OpenGL вы поддерживаете.

...