Настройка производительности OpenGL для пропускной способности геометрии - PullRequest
14 голосов
/ 13 июля 2010

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

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

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

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

Пример визуализированных данных http://gimaker.users.sourceforge.net/0010.png

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

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

Итак, мои вопросы, как мне это ускорить?Т.е.:

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

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

Ответы [ 3 ]

5 голосов
/ 13 июля 2010

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

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

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

0 голосов
/ 16 июля 2010

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

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

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

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

Вы тоже пробовали режим VA? Вы используете glDrawElements? glDrawArrays? Удобен ли кеш вершин данных (до и после преобразования)?

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