使用OpenGL在C ++中绘制带有大量数据点的散点图的最佳方法

时间:2011-08-03 16:35:13

标签: c++ opengl scatter-plot vertex-array

我正在用C ++编写一个程序,通过UDP套接字获取4维点数据,然后在6个独立的2D散点图中绘制数据。例如,如果我们命名尺寸:A,B,C,D六个2d图将是AxB,AxC,AxD,BxC,BxD和CxD。在几个小时的过程中,该计划累积了大约50K点。

目前,我使用立即模式绘制每个点一次。我没有清除绘制调用之间的缓冲区,因此先前绘制的点会一直存在,直到缓冲区被清除。我对这种方法不满意,因为立即模式很慢并且已弃用。当我必须清除缓冲区时,就像窗口重新调整大小时一样,我丢失了之前绘制的所有数据。我想提出一个解决方案,在清除缓冲区后允许数据持久化。另外,如果可以使用窗口重新调整大小来轻松缩放绘图,那将是很好的。

我考虑过为每个坐标系维护一个顶点数组(有2个维度),但这需要6个独立的数组,并且需要3倍的内存来维护一个包含所有4个维度的数组。

我是否以正确的方式思考这个问题?这个问题的正确解决方案是什么?

最终目标是让应用程序尽可能接近实时地显示数据。

编辑是否有可能在他们进来时逐一绘制点,当我需要调整屏幕大小时抓住屏幕图像,然后显示调整后的版本图像?

1 个答案:

答案 0 :(得分:5)

使用顶点缓冲区对象可以提高渲染速度,因为绘制的几何体可以直接存储在图形卡内存中。但是,在您的情况下,如果数据总是发生变化,我无法告诉您此方法是否比立即模式更快,因为每次数据更改时您可能必须重建顶点数组对象。如果您只添加点,也许您可​​以使多个VBO组合点,并使用立即模式渲染最后接收的点,直到您可以创建新组。例如,如果你收到了100054分,也许你可以制作10组10000点并立即渲染最后54分。

关于内存问题,我认为可以在图形卡顶点中存储4个元素 - 然后你可以使用不同的顶点着色器来选择顶点的哪些组件用作渲染坐标。使用这种技术,内存使用量只会是你收到的两倍:一个用于接收数据,一个用于顶点缓冲区对象。