Это, вероятно, спросили много раз, но я ничто не мог найти полезным, таким образом, здесь это идет снова...
В моем приложении я должен представить довольно большую сетку (несколько миллионов треугольников или больше), и у меня есть некоторые проблемы при вытаскивании достойной частоты кадров из него. ЦП в значительной степени бездействует так, я определенно ограничен GPU. Изменение разрешения не влияет на производительность, таким образом, это не фрагмент - или ограниченный растром.
Сетка является динамичной (но локально статичной), таким образом, я не могу сохранить все это в видеокарте и представить ее с одним вызовом. По специализированным причинам данные хранятся как дерево октантов с вокселами в листах со средствами, я получаю frustum, отбирающий в основном бесплатно. Данные вершины состоят из координат, normals и цветов - никакие структуры или программы построения теней не используются.
Мой первый подход должен был просто представить все из памяти использование одного большого STREAM_DRAW
VBO, который оказался слишком медленным. Моя начальная буква думала, был то, что я, возможно, перенапрягал шину (продвигающий ~150 мебибайт за кадр), таким образом, я реализовал кэширующуюся схему, которая хранит геометрию, недавно раньше представлял объект в статическом VBOs на видеокарте, с каждым VBO хранение нескольких 100 кибибайт к ценности на несколько мебибайт данных (хранящий больше на VBO дает больше перегрузки кэша, таким образом, существует компромисс здесь). Изображение ниже является примером того, на что похожи данные, где все окрасило красным, оттянут из кэшируемого VBOs.
(источник: sourceforge.net)
Как числа ниже шоу, я не вижу захватывающее увеличение производительности при использовании кэша. Для полностью статической сетки приблизительно 1 миллиона треугольников я получаю следующую частоту кадров:
STATIC_DRAW
VBOs: 2,4 ГцТак мои вопросы то, как я ускоряю это? Т.е.:
GL_FLOAT
и GL_UNSIGNED_BYTE
для цветов, с одним дополнительным байтом для получения 4-байтового выравнивания (общее количество на 28 байтов/вершины).Я не интересуюсь ответами, предлагающими LOD (я уже протестировал это), определенные для поставщика подсказки или использующие функции OpenGL от чего-либо позже, чем 1,5.
Вам, вероятно, не понравится этот ответ....
Я нашел вашу проблему: Intel GM965 с драйверами Linux с открытым исходным кодом
Хотя моя текущая работа не соответствует вашему объему данных, мы отрисовали несколько миллионов вершин в VBO, и графическое оборудование/драйверы Intel оказались бесполезными. Купите себе карту NVidia (и смиритесь с необходимостью использовать бинарный драйвер, он просто работает), и все будет готово. Не обязательно даже текущего поколения, хотя топовая Quadro (если работа платит) или топовая GTX 400 (если вы платите или просто пытаетесь сэкономить немного баксов на работе) должны работать отлично с последними драйверами. Вы также можете попробовать найти машину с этим оборудованием для тестирования, если модернизация вашей машины не является вариантом.
Я бы сначала использовал профилировщик производительности (например, gDEBugger), чтобы вы могли понять, ограничены ли вы вершинами, фрагментами или шиной и т.д. Трудно предположить, какие оптимизации следует выполнить в таком конкретном случае (Intel + драйверы с открытым исходным кодом).
Вы также пробовали режим VA? Используете ли вы glDrawElements
? glDrawArrays
? Дружественны ли данные вершинному кэшу (до и после трансформации)?
Я не знаю о вашей "сетке", но кажется, что все они кубики. Если у вас есть такая возможность, отрендерите один объединенный куб в список отображения и отрендерите масштабированную версию этого списка отображения. Это часто дает 10-кратное ускорение, поскольку шина не перегружается вершинными данными и не истощается видеопамять.
Конечно, это зависит от вашей способности изменять данные. Это может быть не так, если на самом деле все не так, как на картинке.