我们为巨大的数据集生成图表。我们说的是每秒4096个样本,每个图表10分钟。一个简单的计算可以得到每行图4096 * 60 * 10 = 2457600个样本。每个样本都是双(8字节)精度FP。此外,我们在一个屏幕上渲染多个线图,最多约一百个。这使我们在一个屏幕上渲染大约25M个样本。使用常识和简单的技巧,我们可以使用CPU在2D画布上绘制此代码来获得此代码。 Performant,即渲染时间低于一分钟。 由于这是科学数据,我们不能省略任何样本。说真的,这不是一个选择。甚至不要开始考虑它。
当然,我们希望使用所有可用技术来改善渲染时间。多核,预渲染,缓存都非常有趣,但不要削减它。我们希望使用这些数据集进行30FPS渲染,最低为60FPS。我们现在这是一个雄心勃勃的目标。
卸载图形渲染的一种自然方法是使用系统的GPU。 GPU可用于处理大型数据集并对其进行并行处理。一些简单的HelloWorld测试显示我们使用GPU在渲染速度方面昼夜不同。
现在的问题是:GPU API,如OpenGL,DirectX和XNA都是为3D场景而设计的。因此,使用它们来渲染2D线图是可能的,但并不理想。在我们开发的概念证明中,我们遇到了我们需要将2D世界转换为3D世界。 Suddnely我们必须使用和XYZ坐标系统与多边形,顶点和更多的善良。从发展的角度来看,这远非理想。代码变得难以理解,维护是一场噩梦,更多问题沸腾了。
您对3D的建议或想法是什么?这是实现转换两个系统(2D坐标与3D坐标和实体)的唯一方法吗?或者有更简洁的方法来实现这一目标吗?
- 为什么在一个像素上渲染多个样本是有用的? 因为它更好地代表了数据集。假设在一个像素上,您有值2,5和8.由于一些样本省略算法,只绘制了5。该行只会变为5,而不会变为8,因此数据会失真。您也可以争论相反,但事实是第一个参数对我们使用的数据集起作用。 这正是我们不能省略样本的原因。
答案 0 :(得分:6)
在tgamblin的答案背后,我想评论你断言你不能省略样本。
您应该将您绘制到屏幕上的数据视为抽样问题。你说的是2.4M的数据点,你试图把它画到一个只有几千点的屏幕上(至少我假设它是,因为你担心30fps的刷新率)< / p>
这意味着对于x轴中的每个像素,您都需要以1000点的顺序进行渲染。即使你确实沿着利用你的gpu(例如通过使用opengl)开辟了道路,这仍然是gpu需要为那些不可见的行所做的大量工作。
我用于呈现样本数据的技术是生成一组数据,这些数据是整个集合的一个子集,仅用于渲染。 对于x轴中的给定像素(即给定的x轴屏幕坐标),您需要渲染绝对最多4个点 - 即最小y,最大y,最左边y和最右边y 。 这将呈现可以有用地呈现的所有信息。您仍然可以看到最小值和最大值,并保留与相邻像素的关系。
考虑到这一点,您可以计算出落入x轴中相同像素的样本数(将它们视为数据“bins”)。在给定的bin中,您可以确定最大值,最小值等的特定样本。
重申一下,这只是一个用于显示的子集 - 只有在显示参数发生变化时才适用。例如。如果用户滚动图形或缩放,则需要重新计算渲染子集。
如果您使用的是opengl,则可以执行此操作,但由于opengl使用标准化坐标系(并且您对真实世界的屏幕坐标感兴趣),因此您必须更加努力地准确确定数据箱。 不使用opengl会更容易,但是你没有充分利用你的图形硬件。
答案 1 :(得分:5)
如果你不想,你真的不必担心Z轴。在OpenGL(例如)中,您可以指定XY顶点(隐式Z = 0),转动zbuffer,使用非投影投影矩阵,并且嘿presto你是2D。
答案 2 :(得分:5)
一个非常受欢迎的科学可视化工具包是VTK,我认为它适合您的需求:
这是一个高级API,因此您不必使用OpenGL(VTK建立在OpenGL之上)。有C ++,Python,Java和Tcl的接口。我认为这会让你的代码库保持干净。
您可以将各种数据集导入VTK(从医学影像到财务数据,有大量的例子)。
VTK非常快,如果您想进行非常大的可视化,可以在多台机器上分发VTK图形管道。
关于:
这使我们在一个屏幕上渲染大约25M个样本。
[...]
由于这是科学数据,我们不能省略任何样本。说真的,这不是一个选择。甚至不要开始考虑它。
您可以通过采样和使用LOD模型在VTK中渲染大型数据集。也就是说,你有一个模型,你可以从远处看到一个较低分辨率的版本,但如果你放大,你会看到一个更高分辨率的版本。这就是很多大型数据集渲染的完成方式。
您不需要从实际数据集中消除点数,但是当用户放大时,您可以确定地逐步细化它。当用户不可能在单个屏幕上渲染2500万点时没有任何好处处理所有数据。我建议您查看VTK库和VTK用户指南,因为在那里有关于可视化大型数据集的方法的宝贵信息。
答案 3 :(得分:3)
Mark Bessey提到它,您可能缺少显示图形的像素。但是考虑到你的解释,我假设你知道你在做什么。
OpenGL具有正交模式,其内部具有z坐标(0; 1)。没有透视投影,您绘制的多边形将与屏幕剪裁区域平面。
DirectX会有类似的。在OpenGL上,它被称为gluOrtho2d()。
答案 4 :(得分:2)
如果将投影设置为正交(无z),OpenGL很乐意渲染2D。您还应该抽取数据。渲染相同像素1000次是浪费GPU。使用performat多线程抽取器花费您的时间。一定要使用顶点数组或顶点缓冲区对象在GPU上爆破大型数组(显然我是一个OpenGL的人)
答案 5 :(得分:1)
这使我们在一个屏幕上渲染大约25M个样本。
不,不,除非你有一个非常大的屏幕。鉴于屏幕分辨率可能更像是1,000到2,000像素,你真的应该考虑在绘制数据之前抽取数据。在每行1000点处绘制一百行可能不会有太大问题,性能明智。
答案 6 :(得分:1)
如果您的代码因为直接处理3D内容而无法读取,则需要编写一个封装所有3D OpenGL内容的精简适配器层,并以适合您应用程序的形式获取2D数据。
如果我错过了什么,请原谅我,并向合唱团宣传基本的面向对象设计。只是说'...
答案 7 :(得分:1)
您不需要从实际数据集中消除点数,但是当用户放大时,您可以确定地逐步细化它。当用户不可能在单个屏幕上渲染2500万点时没有任何好处处理所有数据。我建议您查看VTK库和VTK用户指南,因为在那里有关于可视化大型数据集的方法的宝贵信息。
非常感谢你。这正是我所寻找的。似乎VTK也使用硬件来卸载这种渲染。顺便说一句,我猜你的意思是有价值的;)。 其次,用户确实获得了我给出的示例的信息。然而,不是很简洁,数据的概述对于科学家来说真的可以是纯金。它不是为用户处理所有数据,而是从渲染中获取有价值的信息。用户似乎也这样做,即使在数据集的“缩小”表示中也是如此。
还有其他建议吗?
答案 8 :(得分:1)
我想指出,除了直接使用VTK之外,还有另外两种基于VTK的产品可能会让您感兴趣。
1)ParaView(paraview.org)是一个建立在VTK之上的用户界面,使科学可视化产品更加容易。如果您有硬件来处理它,您可以呈现所需的所有数据,并且它支持多个处理器/核心/集群的MPI。它可以通过用户创建的插件进行扩展,并使用自动化工具进行项目构建和编译。
2)ParaViewGeo(paraviewgeo.mirarco.org)是我工作的公司生产的ParaView的地质和采矿勘探衍生物。它内置支持读取ParaView不能读取的文件格式,例如Gocad,Datamine,Geosoft,SGems等。更重要的是,我们经常与其他对科学领域感兴趣的团队合作,其中包括松散关联到挖掘的可交付成果,例如我们最近与一组进行有限/离散元素建模的工作。可能值得一试。
在这两种情况下(PV和PVG),您的数据被视为与您对该数据的看法是分开的,因此,您永远不会“呈现”您的所有数据(因为您可能不会有足够大的监视器)这样做)但请放心,它将按照您的预期从您的数据集中“处理”。如果您对数据运行其他过滤器,那么只有可以看到的内容将被“呈现”,但过滤器将计算所有数据,虽然可能不会一次全部显示,但所有数据都将存在于内存中。
如果您正在寻找数字,今天我在PVG中计算了3个800万个细胞的常规网格。一个包含一个7元组的向量属性(7x8,000个双值),另外两个包含一个标量属性(每个1x 800万个双值),总共有7200万个内存值。我相信内存占用接近500MB,但我也有400,000点设置,每个点都有一个7元组的矢量属性和一些其他杂项数据。
答案 9 :(得分:0)
不确定这是否有用,但您可以将时间用作尺寸吗?即一帧是一个z?那可能会让事情变得更清楚?那么也许你可以有效地应用增量来建立(即在z轴上)图像?
答案 10 :(得分:0)
不,你不这样做,除非你有一个非常大的屏幕。鉴于屏幕分辨率可能更像是1,000到2,000像素,你真的应该考虑在绘制数据之前抽取数据。在每行1000点处绘制一百行可能不会有太大问题,性能明智。
首先,渲染时我们不能省略任何样本。这是不可能的。这意味着渲染对图表所基于的数据不准确。这真是一个禁区。期。
其次,我们 渲染所有样本。可能是多个样本最终在同一个像素上。但是,我们仍在渲染它。样本数据在屏幕上转换。因此,它被渲染。人们可以怀疑这种可视化数据的有用性,科学家(我们的客户)实际上要求我们这样做。他们有一个好点,恕我直言。
答案 11 :(得分:0)
将库包裹在更温和,更友好的2D库中,并将Z和旋转都设置为0。
- 亚当