Я пытаюсь реализовать что-то вроде визуализатора данных, похожего на следующие два снимка экрана (gnome-system-monitor):
Как вы можете видетьэто простой линейный график сетевого трафика, который обновляется каждую секунду.Но вместо того, чтобы обновлять график раз в секунду, я хотел бы отображать данные в режиме реального времени каждые 10 мс или около того.Поскольку я в конечном итоге построю множество точек данных, я решил использовать объекты буфера вершин (VBO), чтобы данные загружались только один раз в графический процессор.Но даже при использовании VBO производительность может сильно различаться, и поэтому мне было интересно, каков наилучший подход для реализации этого.До сих пор я придумал следующие сценарии:
- разбить график на множество сегментов, чтобы каждый сегмент отображался в один VBO.После получения некоторых новых данных я удалю первый VOB (тот, который будет перемещен из графика влево), создам новый VBO и загрузю новые данные.Затем я перенесу 'камеру' с помощью
glTranslatef
и, наконец, заново отредактирую сцену - так же, как и раньше, но вместо удаления VBO и создания нового, я свяжу старый и загрузлю новыйданные в него
, поскольку прохождение большого списка VBO и рендеринг содержимого занимает очень много времени (много вызовов gl*
), я также рассматривал следующие два подхода:
- создать одно VBO для всех точек данных на графике.Как только мы получим новые данные, я получу доступ к данным на GPU, используя
glMapBuffer
.Затем я поверну данные так, чтобы первые несколько точек были в конце.Затем я перезаписал бы эти точки в конце новых входящих данных - , например, создал бы 5 VBO: тот, который содержит данные для большей части экрана.И четыре оставшихся, которые содержат данные для последних четырех пакетов входящих данных.Таким образом, я всегда мог просто вращать 4 последних VBO и обновлять последний новыми данными.Но мне также пришлось бы вращать данные в большом VBO.
Возможно, есть лучшие способы реализовать то, что я планирую сделать?Как я могу минимизировать количество gl*
звонков, чтобы получить что-то вроде 100FP?Это даже реалистично (скажем, с 300000 точек)?
РЕДАКТИРОВАТЬ: Я понимаю, что я действительно не могу отрисовать 300000 точек данных.Однако это не мой вопрос.Мой вопрос на самом деле, как наиболее эффективно обновить эти данные.При подходе один и два я получаю что-то вроде 10FPS, что крайне мало.