Лучший способ нарисовать точечный график с большим количеством точек данных в C ++, используя OpenGL - PullRequest
5 голосов
/ 03 августа 2011

Я пишу программу на C ++, которая получает данные четырехмерных точек через сокет UDP, а затем отображает данные в 6 отдельных точечных точечных диаграммах.Например, если мы назовем размеры: A, B, C, D, шесть 2D-графиков будут AxB, AxC, AxD, BxC, BxD и CxD.В течение нескольких часов программа набирает ~ 50 тыс. Баллов.

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

Я думал о поддержании массива вершин (с 2 измерениями) для каждой системы координат, но для этого потребовалось бы 6 отдельныхмассивы и требуют в 3 раза больше памяти для поддержки массива со всеми 4 измерениями.

Правильно ли я думаю об этом?Как правильно решить эту проблему?

Конечная цель - создать приложение, отображающее данные как можно ближе к реальному времени.

Редактировать БудетМожно ли продолжать рисовать точки по очереди, когда они появляются, и когда мне нужно изменить размер экрана, возьмите изображение с экрана и затем отобразите версию этого изображения с измененным размером?

1 Ответ

5 голосов
/ 03 августа 2011

Использование буфера вершин Объекты могут увеличить скорость рендеринга, потому что геометрия для рисования может быть сохранена непосредственно в памяти графической карты. Однако, в вашем случае, если данные всегда изменяются, я не могу сказать вам, будет ли этот метод быстрее, чем немедленный режим, потому что вам, возможно, придется восстанавливать объект Vertex Array при каждом изменении данных. Если вы только добавляете точки, возможно, вы можете сделать несколько VBO для групповых точек и визуализировать последние полученные точки, используя немедленный режим, пока вы не сможете создать новую группу. Например, если вы получили 100054 балла, возможно, вы можете сделать 10 групп по 10000 баллов и отрисовать последние 54 балла в немедленном режиме.

Что касается проблемы с памятью, я думаю, что возможно было бы сохранить в вершинах графической карты 4 элемента - тогда вы могли бы использовать разные вершинные шейдеры, которые выбирают, какие компоненты вашей вершины использовать в качестве координат рендеринга. Используя эту технику, использование памяти будет только вдвое больше того, что вы получили: один для полученных данных и один для объекта буфера вершин.

...