当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用OpenGL在C++中绘制带有大量数据点的散点图的最佳方法》经验,为你挑选了1个好方法。

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

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

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

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

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

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



1> neodelphi..:

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

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


VBO应该至少不比客户端阵列慢,并且肯定比立即模式更快.它不仅是内存副本,而且是VBO(以及一般的顶点数组)所用的驱动程序调用开销.
@ user786653不确定,在他使用坐标A和D的情况下,我不知道他怎么能跳过B和C坐标.也许使用统一属性将有助于使用一个着色器(选择器将由着色器使用给定的属性完成)但这可能不如使用多个着色器快.
可以映射缓冲区.如果附加了点,则仅发送差异.应尽可能避免立即模式.
推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有