Настройка производительности OpenGL для пропускной способности геометрии

Это, вероятно, спросили много раз, но я ничто не мог найти полезным, таким образом, здесь это идет снова...

В моем приложении я должен представить довольно большую сетку (несколько миллионов треугольников или больше), и у меня есть некоторые проблемы при вытаскивании достойной частоты кадров из него. ЦП в значительной степени бездействует так, я определенно ограничен GPU. Изменение разрешения не влияет на производительность, таким образом, это не фрагмент - или ограниченный растром.

Сетка является динамичной (но локально статичной), таким образом, я не могу сохранить все это в видеокарте и представить ее с одним вызовом. По специализированным причинам данные хранятся как дерево октантов с вокселами в листах со средствами, я получаю frustum, отбирающий в основном бесплатно. Данные вершины состоят из координат, normals и цветов - никакие структуры или программы построения теней не используются.

Мой первый подход должен был просто представить все из памяти использование одного большого STREAM_DRAW VBO, который оказался слишком медленным. Моя начальная буква думала, был то, что я, возможно, перенапрягал шину (продвигающий ~150 мебибайт за кадр), таким образом, я реализовал кэширующуюся схему, которая хранит геометрию, недавно раньше представлял объект в статическом VBOs на видеокарте, с каждым VBO хранение нескольких 100 кибибайт к ценности на несколько мебибайт данных (хранящий больше на VBO дает больше перегрузки кэша, таким образом, существует компромисс здесь). Изображение ниже является примером того, на что похожи данные, где все окрасило красным, оттянут из кэшируемого VBOs.

Example of the rendered data
(источник: sourceforge.net)

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

  • Без кэширования: 1,95 Гц
  • Кэширование массивов вершины использования: 2,0 Гц (> 75% сетки кэшируются),
  • Кэширование использования STATIC_DRAW VBOs: 2,4 Гц

Так мои вопросы то, как я ускоряю это? Т.е.:

  • Что рекомендуемый формат вершины должен получить достойную производительность? Я использую хранение с чередованием с положениями и normals как GL_FLOAT и GL_UNSIGNED_BYTE для цветов, с одним дополнительным байтом для получения 4-байтового выравнивания (общее количество на 28 байтов/вершины).
  • Могло ли использование того же буфера для normals для всех моих полей помочь (все поля выравниваются осью так, я могу выделить нормальный буфер размер самой большой записи кэша и использовать его для них всех).
  • Как я знаю, какая часть конвейера является узким местом? У меня нет захватывающей видеокарты (Intel GM965 с драйверами Linux с открытым исходным кодом), таким образом, возможно, что я поразил его предел. Сколько пропускной способности я могу ожидать от типичных аппаратных средств (2-3 года интегрировали графику, современную интегрированную графику, современную дискретную графику)?
  • Любые другие подсказки относительно того, как Вы занялись бы этим, ловушками, и т.д.

Я не интересуюсь ответами, предлагающими LOD (я уже протестировал это), определенные для поставщика подсказки или использующие функции OpenGL от чего-либо позже, чем 1,5.

14
задан Glorfindel 2 August 2019 в 01:08
поделиться

3 ответа

Вам, вероятно, не понравится этот ответ....

Я нашел вашу проблему: Intel GM965 с драйверами Linux с открытым исходным кодом

Хотя моя текущая работа не соответствует вашему объему данных, мы отрисовали несколько миллионов вершин в VBO, и графическое оборудование/драйверы Intel оказались бесполезными. Купите себе карту NVidia (и смиритесь с необходимостью использовать бинарный драйвер, он просто работает), и все будет готово. Не обязательно даже текущего поколения, хотя топовая Quadro (если работа платит) или топовая GTX 400 (если вы платите или просто пытаетесь сэкономить немного баксов на работе) должны работать отлично с последними драйверами. Вы также можете попробовать найти машину с этим оборудованием для тестирования, если модернизация вашей машины не является вариантом.

5
ответ дан 1 December 2019 в 16:39
поделиться

Я бы сначала использовал профилировщик производительности (например, gDEBugger), чтобы вы могли понять, ограничены ли вы вершинами, фрагментами или шиной и т.д. Трудно предположить, какие оптимизации следует выполнить в таком конкретном случае (Intel + драйверы с открытым исходным кодом).

Вы также пробовали режим VA? Используете ли вы glDrawElements? glDrawArrays? Дружественны ли данные вершинному кэшу (до и после трансформации)?

0
ответ дан 1 December 2019 в 16:39
поделиться

Я не знаю о вашей "сетке", но кажется, что все они кубики. Если у вас есть такая возможность, отрендерите один объединенный куб в список отображения и отрендерите масштабированную версию этого списка отображения. Это часто дает 10-кратное ускорение, поскольку шина не перегружается вершинными данными и не истощается видеопамять.

Конечно, это зависит от вашей способности изменять данные. Это может быть не так, если на самом деле все не так, как на картинке.

0
ответ дан 1 December 2019 в 16:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: