我们为巨大的数据集生成图表。我们谈论的是每秒 4096 个样本,每张图 10 分钟。简单计算得出,每个线图有 4096 * 60 * 10 = 2457600 个样本。每个样本都是双精度(8 字节)精度 FP。此外,我们在一个屏幕上渲染多个线图,最多可达一百个左右。这使得我们在单个屏幕中渲染大约 2500 万个样本。使用常识和简单的技巧,我们可以使用 CPU 在 2D 画布上绘制此代码来获得高性能。高性能,即渲染时间低于一分钟。 由于这是科学数据,我们不能遗漏任何样本。说真的,这不是一个选择。甚至不要开始思考它。

当然,我们希望使用所有可用的技术来缩短渲染时间。多核、预渲染、缓存都非常有趣,但不要削减它。我们希望这些数据集的渲染速度至少为 30FPS,首选 60FPS。我们现在这是一个雄心勃勃的目标。

卸载图形渲染负载的一种自然方法是使用系统的 GPU。GPU 旨在处理巨大的数据集并并行处理它们。一些简单的 HelloWorld 测试向我们展示了使用 GPU 的渲染速度在白天和晚上的差异。

现在的问题是:OpenGL、DirectX 和 XNA 等 GPU API 专为 3D 场景而设计。因此,使用它们来渲染 2D 线图是可能的,但并不理想。在我们开发的概念验证中,我们遇到需要将 2D 世界转变为 3D 世界。突然间,我们必须使用具有多边形、顶点和更多优点的 XYZ 坐标系。从发展的角度来看,这远非理想。代码变得难以阅读,维护成为一场噩梦,并且更多问题不断涌现。

对于 3D 效果,您有什么建议或想法?唯一的方法是实际转换两个系统(2D 坐标与 3D 坐标和实体)吗?或者有更时尚的方法来实现这一目标吗?

- 为什么在一个像素上渲染多个样本很有用?因为它更好地代表了数据集。假设在一个像素上,您的值是 2、5 和 8。由于某些样本省略算法,仅抽取了 5 个。该线只会到达 5,而不会到达 8,因此数据会失真。您也可以提出相反的观点,但事实是第一个参数对我们使用的数据集很重要。这正是我们不能省略样本的原因。

有帮助吗?

解决方案

一个非常流行的科学可视化工具包是 VTK, ,我认为它适合您的需求:

  1. 它是一个高级 API,因此您不必使用 OpenGL(VTK 构建在 OpenGL 之上)。有 C++、Python、Java 和 Tcl 的接口。我认为这会让你的代码库非常干净。

  2. 您可以将各种数据集导入VTK(有大量的示例,从医学成像到金融数据)。

  3. VTK 速度相当快,如果您想要进行非常大的可视化,您可以将 VTK 图形管道分布在多台机器上。

  4. 关于:

    这使得我们在单个屏幕中渲染大约 2500 万个样本。

    [...]

    由于这是科学数据,我们不能遗漏任何样本。说真的,这不是一个选择。甚至不要开始思考它。

您可以通过采样和使用 LOD 模型在 VTK 中渲染大型数据集。也就是说,您将拥有一个模型,从远处可以看到较低分辨率的版本,但如果放大,您会看到更高分辨率的版本。这就是完成大量大型数据集渲染的方式。

您不需要从实际数据集中消除点,但当用户放大时,您肯定可以逐步细化它。当用户无法处理所有数据时,在单个屏幕上渲染 2500 万个点对您没有任何好处。我建议您查看 VTK 库和 VTK 用户指南,因为其中有一些关于可视化大型数据集的方法的宝贵信息。

其他提示

我想对您在 tgamblin 的答案后面不能省略样本的断言发表评论。

您应该将绘制到屏幕上的数据视为采样问题。你正在谈论 240 万个数据点,并且你试图将其绘制到只有几千个点的屏幕上(至少我假设是这样,因为你担心 30fps 刷新率)

因此,这意味着对于 x 轴上的每个像素,您将按照 1000 个点的顺序进行渲染,而您并不需要这样做。即使您确实走上了利用 GPU 的道路(例如通过使用 opengl),对于不可见的线条,GPU 仍然需要做大量的工作。

我用于呈现示例数据的一种技术是生成一组数据,该数据集是整个数据集的子集,仅用于渲染。对于 x 轴上的给定像素(即给定的 x 轴屏幕坐标)您需要渲染 绝对 最多 4 个点 - 即最小 y、最大 y、最左边 y 和最右边 y。这将呈现所有可以有效呈现的信息。您仍然可以看到最小值和最大值,并且保留与相邻像素的关系。

考虑到这一点,您可以计算出将落入 x 轴上同一像素的样本数量(将它们视为数据“箱”)。在给定的 bin 内,您可以确定最大值、最小值等的特定样本。

重申一下,这只是用于显示的子集 - 并且仅在显示参数更改之前才适用。例如。如果用户滚动图表或缩放,则需要重新计算渲染子集。

如果您使用的是 opengl,则可以执行此操作,但由于 opengl 使用标准化坐标系(并且您对现实世界的屏幕坐标感兴趣),因此您将必须更加努力才能准确确定数据箱。如果不使用 opengl,这会更容易,但这样您就无法充分利用图形硬件的优势。

如果您不想的话,实际上不必担心 Z 轴。例如,在 OpenGL 中,您可以指定 XY 顶点(隐式 Z=0)、打开 zbuffer、使用非投影投影矩阵,然后嘿,您就进入了 2D。

马克·贝西(Mark Bessey)提到过,您可能缺少显示图形的像素。但鉴于您的解释,我假设您知道自己在做什么。

OpenGL有一个正交模式 其 z 坐标位于 (0;1) 内。没有透视投影,您绘制的多边形将与屏幕剪切区域平面。

DirectX也会有类似的。在 OpenGL 上,它称为 gluOrtho2d()。

如果您将投影设置为正交(无 z),OpenGL 很乐意渲染 2D。您还应该减少您的数据。将同一像素渲染 1000 次是对 GPU 的浪费。预先花时间使用高性能多线程抽取器。一定要使用顶点数组或顶点缓冲区对象在 GPU 上爆炸大型数组(显然我是一个 OpenGL 爱好者)

这使得我们在单个屏幕中渲染大约 2500 万个样本。

不,你不会,除非你有 真的很大 屏幕。鉴于屏幕分辨率可能更像是 1,000 - 2,000 像素,您确实应该考虑在绘制图表之前对数据进行抽取。从性能角度来看,绘制一百条线、每条线 1,000 个点可能不会有太大问题。

如果您的代码因为直接处理 3D 内容而变得不可读,则需要编写一个薄适配器层来封装所有 3D OpenGL 内容,并以适合您的应用程序的形式获取 2D 数据。

如果我错过了一些东西,请原谅我,我正在向合唱团宣讲基本的面向对象设计。只是在说'...

您不需要从实际数据集中消除点,但当用户放大时,您肯定可以逐步细化它。当用户无法处理所有数据时,在单个屏幕上渲染 2500 万个点对您没有任何好处。我建议您查看 VTK 库和 VTK 用户指南,因为其中有一些关于可视化大型数据集的方法的宝贵信息。

非常感谢。这正是我一直在寻找的。看来 VTK 也使用硬件来卸载此类渲染。顺便说一句,我猜你的意思是 有价值的 ;)。其次,用户确实获得了我给出的示例的信息。尽管不是很简洁,但数据概述对于科学家来说确实是纯金。它不是为用户处理所有数据,而是从渲染中获取有价值的信息。即使在数据集的“缩小”表示中,用户似乎也会这样做。

还有更多建议吗?

我想指出的是,除了直接使用 VTK 之外,您可能还会对基于 VTK 构建的另外两种产品感兴趣。

1) ParaView (paraview.org) 是一个建立在 VTK 之上的用户界面,它使科学可视化产品变得更加容易。只要有硬件来处理,您就可以渲染您想要的所有数据,并且它支持多处理器/内核/集群的 MPI。它可以通过用户创建的插件进行扩展,并使用自动化工具进行项目构建和编译。

2)ParaViewGeo(paraviewgeo.mirarco.org)是我工作的公司出品的ParaView的地质和采矿勘探衍生品。它内置支持读取 ParaView 不支持的文件格式,例如 Gocad、Datamine、Geosoft、SGems 等。更重要的是,我们经常与其他对科学可视化感兴趣且与采矿交付成果松散相关的团队合作,例如我们最近与一个进行有限/离散元建模的团队合作。也许值得一看。

在这两种情况(PV 和 PVG)中,您的数据被认为与您对该数据的视图是分开的,因此,您永远不会“渲染”所有数据(因为您可能没有足够大的监视器来执行此操作)但请放心,它会按照您的预期从您的数据集中处理“在那里”。如果您对数据运行其他过滤器,则只有可见的内容才会被“渲染”,但过滤器将计算所有数据,尽管这些数据可能不会同时可见,但都将存在于内存中。

如果您正在寻找数字,今天我在 PVG 中计算了三个包含 800 万个单元的常规网格。其中一个包含 7 元组向量属性(7x 800 万个双值),另外两个各自包含一个标量属性(每个为 1x 800 万个双值),内存中总共有 7200 万个双值。我相信内存占用接近 500MB,但我还有一个 400,000 个点集,其中每个点都有一个 7 元组向量属性和一些其他可用的数据。

不确定这是否有帮助,但是您可以使用时间作为维度吗?IE。一帧就是一个z?也许这会让事情变得更清楚?那么也许您可以有效地应用增量来构建(即在 z 轴上)图像?

不,你不需要,除非你有一个非常非常大的屏幕。鉴于屏幕分辨率可能更像是 1,000 - 2,000 像素,您确实应该考虑在绘制图表之前对数据进行抽取。从性能角度来看,绘制一百条线、每条线 1,000 个点可能不会有太大问题。

首先,渲染时我们不能遗漏任何样本。这是不可能的。这意味着渲染对于图表所基于的数据并不准确。这确实是一个禁区。时期。

其次,我们 渲染所有样本。多个样本可能最终出现在同一个像素上。但我们仍在渲染它。样本数据在屏幕上进行转换。这样就渲染出来了。人们可能会怀疑这种可视化数据的有用性,但科学家(我们的客户)实际上要求我们这样做。恕我直言,他们有一个很好的观点。

将库包裹在更温和、更友善的 2D 库中,并将 Z 和旋转全部设置为 0。

-亚当

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top