Каков наилучший способ управления и обновления VBO для высокопроизводительного визуализатора данных OpenGL? - PullRequest
1 голос
/ 30 марта 2012

Я пытаюсь реализовать что-то вроде визуализатора данных, похожего на следующие два снимка экрана (gnome-system-monitor):

enter image description here enter image description here

Как вы можете видетьэто простой линейный график сетевого трафика, который обновляется каждую секунду.Но вместо того, чтобы обновлять график раз в секунду, я хотел бы отображать данные в режиме реального времени каждые 10 мс или около того.Поскольку я в конечном итоге построю множество точек данных, я решил использовать объекты буфера вершин (VBO), чтобы данные загружались только один раз в графический процессор.Но даже при использовании VBO производительность может сильно различаться, и поэтому мне было интересно, каков наилучший подход для реализации этого.До сих пор я придумал следующие сценарии:

  • разбить график на множество сегментов, чтобы каждый сегмент отображался в один VBO.После получения некоторых новых данных я удалю первый VOB (тот, который будет перемещен из графика влево), создам новый VBO и загрузю новые данные.Затем я перенесу 'камеру' с помощью glTranslatef и, наконец, заново отредактирую сцену
  • так же, как и раньше, но вместо удаления VBO и создания нового, я свяжу старый и загрузлю новыйданные в него

, поскольку прохождение большого списка VBO и рендеринг содержимого занимает очень много времени (много вызовов gl*), я также рассматривал следующие два подхода:

  • создать одно VBO для всех точек данных на графике.Как только мы получим новые данные, я получу доступ к данным на GPU, используя glMapBuffer.Затем я поверну данные так, чтобы первые несколько точек были в конце.Затем я перезаписал бы эти точки в конце новых входящих данных
  • , например, создал бы 5 VBO: тот, который содержит данные для большей части экрана.И четыре оставшихся, которые содержат данные для последних четырех пакетов входящих данных.Таким образом, я всегда мог просто вращать 4 последних VBO и обновлять последний новыми данными.Но мне также пришлось бы вращать данные в большом VBO.

Возможно, есть лучшие способы реализовать то, что я планирую сделать?Как я могу минимизировать количество gl* звонков, чтобы получить что-то вроде 100FP?Это даже реалистично (скажем, с 300000 точек)?

РЕДАКТИРОВАТЬ: Я понимаю, что я действительно не могу отрисовать 300000 точек данных.Однако это не мой вопрос.Мой вопрос на самом деле, как наиболее эффективно обновить эти данные.При подходе один и два я получаю что-то вроде 10FPS, что крайне мало.

Ответы [ 2 ]

4 голосов
/ 30 марта 2012

разбивает график на множество сегментов, так что каждый сегмент отображается в один VBO.После получения некоторых новых данных я удалю первый VOB (тот, который будет перемещен из графика влево), создам новый VBO и загрузю новые данные.Затем я переключу 'камеру' с помощью glTranslatef и, наконец, заново отрендерирую сцену

Нет, сохраню данные в одном VBO, но не пытайтесь рисовать все это одновременно.Вы можете отлично рисовать только подмножества данных.Также VBO отдых является дорогостоящей операцией.Просто обновите его.

так же, как и раньше, но вместо удаления VBO и создания нового я свяжу старый и загрузлю в него новые данные

Лучше, но обязательно используйте только glBufferSubData и обновляйте только измененные точки данных, а не все.

создайте один VBO для всех точек данных на графике.Как только мы получаем новые данные, я получаю доступ к данным на графическом процессоре, используя glMapBuffer.Затем я поверну данные так, чтобы первые несколько точек были в конце.Затем я перезаписал бы эти точки в конце новых входящих данных

Почему так сложно?Просто сместите базовый индекс в VBO и начертите оттуда.

создайте, например, 5 VBO: тот, который содержит данные для большей части экрана.И четыре оставшихся, которые содержат данные для последних четырех пакетов входящих данных.Таким образом, я всегда мог просто вращать 4 последних VBO и обновлять последний новыми данными.Но мне также пришлось бы вращать данные в большом VBO.

Вы можете сделать это с одним VBO на отлично.Просто попытайтесь увидеть VBO как некоторую кучу памяти, которую вы используете только кусочками.

4 голосов
/ 30 марта 2012

Ваш экран имеет около 2000 пикселей по горизонтали. Таким образом, в любой момент времени на вашем графике будет отображаться не более 2000 различимых точек данных. Это не огромное количество данных. Пробовали ли вы наивный подход, состоящий в том, чтобы просто передавать все с каждым кадром, и определили, что это не работает достаточно хорошо, прежде чем пытаться быть умным в отношении сложного управления VBO?

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