Является ли glDrawElements () более эффективным, чем glDrawArrays (), когда имеется много повторяющихся вершин? - PullRequest
9 голосов
/ 15 января 2010

Я пытаюсь выжать некоторое увеличение производительности из моего приложения iPhone OpenGL ES.Согласно Instruments, моя загрузка тайлера в большинстве случаев составляет около 100%, а мой FPS - около 24. Я бы хотел повысить свой FPS более чем на 30. Я могу добиться этого, конвертируя из GL_FLOAT в GL_SHORT, но это представляет некоторыедовольно сложные технические проблемы для меня на данный момент.Я бы предпочел не идти туда.

Итак, я рассматриваю возможность перехода от glDrawArrays () к glDrawElements ().У меня 35 мешей, составленных из 708 вершин, но многие из этих вершин распределяются между гранями.Я занимаюсь наложением текстур, но меш в основном однородный по цвету.Грани, требующие специального текстурирования, останутся без изменений.

Допустим, я могу сократить количество вершин пополам.Скажем также, что я также организовал свою геометрию таким образом, который имеет смысл для iPhone: скажем, с помощью инструмента Imagination Technologies PVRTTriStrip.Игнорирование небольшого количества дополнительной памяти для индексного массива, это означает, что я примерно сократил пропускную способность памяти вдвое, поэтому я должен увидеть довольно хорошее увеличение производительности.

Это правда, или я пропустил или неправильно понялчто-то?Совет ценится.

Ответы [ 2 ]

17 голосов
/ 16 января 2010

На случай, если кому-то будет интересно, я попробовал это, без части инструмента PVRTTriStrip. Все тестирование проводилось на iPhone 3G. Я смог уменьшить свои вершины с 708 до 113. И так как мне меньше 255, я использую GLubyte в качестве моего индексного типа. Итак, я пошел от:

35 * (708 * 32) = ~ 774 К

Кому:

35 * (113 * 32 + 708 * 1) = ~ 148 К

Что уменьшило пропускную способность моей памяти до 20% от того, что было. Мой FPS увеличился до ~ 34. Итак, я увидел около 42% улучшения в FPS. В целом, я очень счастлив. Я думаю, что это еще не все, но у меня есть больше рыбы, чтобы жарить.

Кроме того, я отфильтровал группу вырожденных треугольников (бесполезный вид), чтобы уменьшить счетчик до 522 с 708. После этого я увидел увеличение до ~ 40 FPS по сравнению с ~ 34 FPS, которые я видел.

1 голос
/ 16 января 2010

Если вы используете Tiler Utilization 100% в инструментах (, как я был ), вы ограничены размером вашей геометрии. Из всех вещей, которые я пытался улучшить, я заметил заметное увеличение частоты кадров только тогда, когда уменьшил размер геометрии. Так что, да, если вы можете исключить отправку некоторых вершин, вы должны увидеть повышение производительности.

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

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