Performance 实时数据可视化实例

Performance 实时数据可视化实例,performance,opengl,graphics,real-time,visualization,Performance,Opengl,Graphics,Real Time,Visualization,我正在从事实时数据可视化项目,需要渲染性能高达~10Gb/秒的原始数据 要求能够以每个X坐标的最大/最小值(信号和噪声范围)表示的条带形式显示多达10000条数据轨迹。数据显示应平滑,占用不超过单个cpu核心的20%。条纹重叠,应使用一些颜色混合技术。系统是Linux和接口C++。通过计算,我得到了10000strips x 1000points/0.01秒的数据,可以显示*2points min/max=>每秒2*10^9点或大约8Gb/sec的数据速率(大约是pcie3.0 x8的吞吐量)

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

要求能够以每个X坐标的最大/最小值(信号和噪声范围)表示的条带形式显示多达10000条数据轨迹。数据显示应平滑,占用不超过单个cpu核心的20%。条纹重叠,应使用一些颜色混合技术。系统是Linux和接口C++。通过计算,我得到了10000strips x 1000points/0.01秒的数据,可以显示*2points min/max=>每秒2*10^9点或大约8Gb/sec的数据速率(大约是pcie3.0 x8的吞吐量)

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


我查看了OpenGL,但对于纯2D来说,它看起来有些过头了。我可以为这个项目使用什么技术?或者有什么例子我可以开始吗?另外,我只需要使用linux的免费库/api。

好的,10Gbit/s的数据大约是每秒1GB(千兆字节)的数据。每一次显示更新间隔大约有20MB的数据(我只是在这里做信封背面的估计)。考虑到R8G8B8色彩空间,这将是关于未压缩的4k视频

不知道如何利用这一点制作线性绘制数据轨迹,而不必首先认真重新布线人类视觉皮层。也许先投资基因编辑

别开玩笑了,你所问的,从技术上来说是完全可能的。第一件事关于这句话的第一个重要注意事项:

我查看了OpenGL,但对于纯2D来说,它看起来有些过头了

*pshht*我让你进入一个小秘密:OpenGL是一个二维图形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”程序

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

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

  • 了解如何使用距离场测试从片段着色器生成绘图(即,对于每个片段(大约一个像素)),测试它离绘图线有多远,并对其进行相应的着色-这将提供具有非常平滑线条的真正高质量绘图,通常比线条条的性能更好


欢迎使用堆栈溢出!不幸的是,像这样的问题是,请尽量缩小你的问题范围,然后提问。请原谅我的提示/问题-你从哪里得到的显示器能够同时显示10000个数据条(每个数据条至少50像素高?)和1000个点。。而一个能以100fps的速度观察所有数据条的操作员?数据条可能会重叠。使用适当的颜色编码工具,应该允许直观地估计异常值、数据密度和可能的一些流分区和分区流行为。通过重叠,它不需要数千张图片的分辨率。常规显示应该足够了。我要求100fps能够保留70%的cpu核心性能,用于30fps的数据准备。顺便说一句,如果想要的输出只是与箱对齐的示波图,那么x分辨率就不需要了