Лучший способ нарисовать точечный график с большим количеством точек данных в C++, используя OpenGL
Я пишу программу на C++, которая получает данные четырехмерных точек через сокет UDP, а затем отображает данные в 6 отдельных точечных точечных диаграммах. Например, если мы назовем размеры: A,B,C,D, шесть двухмерных графиков будут AxB, AxC, AxD, BxC, BxD и CxD. В течение нескольких часов программа набирает ~50 тыс. Баллов.
В настоящее время я строю каждую точку один раз, используя немедленный режим. Я не очищаю буфер между вызовами отрисовки, поэтому ранее нанесенные точки сохраняются до тех пор, пока буфер не будет очищен. Я не доволен этим методом, так как немедленный режим медленный и не рекомендуется. Когда мне нужно очистить буфер, например, когда окно изменяет размеры, я теряю все ранее построенные данные. Я хотел бы предложить решение, которое позволяет сохранять данные после очистки буфера. Кроме того, было бы неплохо, если бы график можно было легко масштабировать с изменением размеров окна.
Я думал о том, чтобы поддерживать массив вершин (с 2 измерениями) для каждой системы координат, но это потребовало бы 6 отдельных массивов и потребовало бы в 3 раза больше памяти для обслуживания массива со всеми 4 измерениями.
Думаю ли я об этом правильно? Как правильно решить эту проблему?
Конечная цель - создать приложение, отображающее данные как можно ближе к реальному времени.
Редактировать Можно ли продолжать рисовать точки по очереди, когда они появляются, и когда мне нужно изменить размер экрана, возьмите изображение с экрана и затем отобразите версию этого изображения с измененным размером?
1 ответ
Использование буфера вершин Объекты могут увеличить скорость рендеринга, поскольку геометрия для рисования может быть сохранена непосредственно в памяти графической карты. Однако, в вашем случае, если данные всегда изменяются, я не могу сказать вам, будет ли этот метод быстрее, чем непосредственный режим, потому что вам, возможно, придется восстанавливать объект массива вершин каждый раз, когда изменяются данные. Если вы только добавляете точки, возможно, вы можете сделать несколько VBO для групповых точек и визуализировать последние полученные точки, используя немедленный режим, пока не сможете создать новую группу. Например, если вы получили 100054 баллов, возможно, вы можете сделать 10 групп по 10000 баллов и отрисовать последние 54 балла в немедленном режиме.
Что касается проблемы с памятью, я думаю, что было бы возможно сохранить вершины графической карты с 4 элементами - тогда вы могли бы использовать различные вершинные шейдеры, которые выбирают, какие компоненты вашей вершины использовать в качестве координат рендеринга. Используя эту технику, использование памяти будет только вдвое больше того, что вы получили: один для полученных вами данных и один для объекта буфера вершин.