实时数据可视化示例

时间:2018-10-05 06:32:13

标签: performance opengl graphics real-time visualization

我正在从事实时数据可视化项目,需要渲染性能高达约10Gb /秒的原始数据。

要求每个X坐标最多应显示10000条数据磁道,以最大/最小值(信号和噪声范围)表示。数据显示应该流畅,且占用单个cpu内核的比例不得超过20%。条带重叠,应使用某种颜色混合技术。系统是Linux,接口是c ++。计算得出了10000条x 1000点/0.01秒以显示* 2点最小/最大=>数据速率2 * 10 ^ 9点/秒或大约8Gb /秒(大约pcie3.0 x8的吞吐量)。

我在图形方面的经验非常有限。我正在寻找相同的示例如何: 1)以8Gb /秒的速率将数据传递到视频卡 2)在视频卡上的矩形中填充一些统计信息,例如通过每个点的条带数(或在CPU上执行此步骤以节省pcie吞吐量?) 3)将(2)中的统计数据转换为点颜色并显示此矩形

我研究了OpenGL,但是对于纯2D来说看起来有些过分了。我可以为该项目使用什么技术?还是我可以从任何例子开始?另外,我只需要为Linux使用免费的library / api。

1 个答案:

答案 0 :(得分:1)

好吧,每秒10Gbit的数据约为1GB(千兆字节)的数据。每个显示更新间隔大约有20MB的数据(我只是在这里做封套估算)。考虑到R8G8B8色彩空间大约是未压缩的4k视频。

不知道如何在不首先严重重新连接人类视觉皮层的情况下使线性标绘数据轨迹成为现实。也许首先投资基因编辑?

开个玩笑,技术上您的要求是完全可能的。关于这一点,第一件事首先是一个重要的注意事项:

  

我研究了OpenGL,但对于纯2D来说看起来有些矫kill过正。

* pshht *我让您进入一个秘密:OpenGL 是2D图形API。所有3和4个元素向量,矩阵,有关变换和内容的讨论?可以这么说,所有的“烟和镜子”。所有这些“ 3D”内容实际上只是为了简化计算而进行的一些便捷操作,在平面屏幕上,高维对象的投影最终在2D空间中。

所有实际图纸?这一切都发生在2D中。

  

我可以为该项目使用什么技术?

OpenGL,Vulkan,DirectX或任何其他加速图形API。

  

计算给了我10000条x 1000点

好吧,现在您必须找到至少在一个方向上具有至少2 * 10000像素的显示器(为什么2×?因为是奈奎斯特,即采样定理)。但是一旦您掌握了这一点,您就可以拥有金色。也许将一堆4k显示器放到视频墙中,然后创建强大的多显示器设置。

要将数据获取到GPU,您要尽可能避免不必要的开销。

通常的想法是在GPU上创建一些缓冲区,以循环方式将数据流式传输到这些缓冲区。使用OpenGL,您可以通过缓冲对象(glGenBuffers,glBindBuffer,glBufferData,glBufferSubData)来完成此操作。

不幸的是,当前的所有图形API都“锁定”以通过内存映射完成所有操作。是的,我明白了,通过虚拟内存做事感觉很好。但这涉及填充页表,这很昂贵。听起来不合常理,直接I / O写入(通过DMA)通常比通过虚拟内存映射便宜。

但是我们没有选择完成方式。在OpenGL中,函数glBufferSubData可以 通过有向I / O的直接写操作进行操作,但是通常它会在后台进行页面映射。使用glMapBuffer可以使它变得明确。

在Vulkan中,所有事情都是通过映射缓冲区发生的,所以就是这样。

在GPU上获得数据后,您将编写一些着色器代码,该代码将从缓冲区对象中获取数据并使用它来控制“像素”的生成(嗯,实际上是片段,但这几乎是相同的事情)。令人惊讶的是,绘制一个全屏三角形(使用剪刀测试剪裁)并从片段着色器中每个像素的缓冲区读取数据通常胜过现代硬件上单个线段的生成。

以下是您需要做的粗略概述:

  • (可选,但建议使用)找到分辨率足够高的显示器,使其能够实际显示您想要看到的内容。

  • (可选)对人类进行基因工程改造,以便他们的眼睛实际上能够分辨出这么多细节。

  • 掌握OpenGL。编写一些“ Hello Triangle”程序。

  • 了解如何在各个着色器阶段从缓冲区对象读取数据。

  • 了解如何从顶点着色器中的缓冲区数据创建线段(不要理会几何着色器,它们很糟糕)。

  • 了解如何使用距离场测试从片段着色器生成图(即,对于每个片段(大约一个像素)),以测试距绘图线有多远,并对其进行相应着色-这给出了线条非常平滑的高质量图片,其性能通常优于线条。