5

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

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

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

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

最终目标是拥有一个尽可能接近实时地显示数据的应用程序。

编辑是否有可能在它们进入时继续一个一个地绘制点,当我需要调整屏幕大小时,抓取屏幕的图像,然后显示该图像的调整大小版本?

4

1 回答 1

5

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

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

于 2011-08-03T16:46:55.380 回答