8

巨大なデータセットのグラフを生成します。1 秒あたり 4096 サンプル、1 グラフあたり 10 分です。簡単な計算では、折れ線グラフあたり 4096 * 60 * 10 = 2457600 サンプルになります。各サンプルは倍精度 (8 バイト) の FP です。さらに、1 つの画面に最大 100 程度の複数の折れ線グラフをレンダリングします。これにより、1 つの画面で約 25M のサンプルをレンダリングできます。常識と簡単なトリックを使用して、2D キャンバスにこれを描画する CPU を使用して、このコードのパフォーマンスを向上させることができます。高性能、つまり、レンダリング時間が 1 分未満になります。これは科学的なデータであるため、サンプルを省略することはできません。真剣に、これはオプションではありません。それについて考え始めることさえしないでください。

当然のことながら、利用可能なすべての手法を使用してレンダリング時間を改善したいと考えています。マルチコア、プリレンダリング、キャッシングはすべて非常に興味深いものですが、それをカットすることはできません。これらのデータセットでは、最低でも 30 FPS のレンダリングが必要であり、60 FPS が推奨されます。これは野心的な目標です。

グラフィックス レンダリングをオフロードする自然な方法は、システムの GPU を使用することです。GPU は、巨大なデータセットを処理し、それらを並列処理するように作られています。GPU を使用したいくつかの単純な HelloWorld テストでは、レンダリング速度の昼と夜の違いが示されました。

問題は、OpenGL、DirectX、XNA などの GPU API が 3D シーンを念頭に置いて作成されていることです。したがって、それらを使用して 2D 線グラフをレンダリングすることは可能ですが、理想的ではありません。私たちが開発した概念実証では、2D の世界を 3D の世界に変換する必要があることがわかりました。突然、ポリゴン、頂点などの XYZ 座標系を使用する必要が生じました。これは、開発の観点からは理想とはほど遠いものです。コードが読めなくなり、メンテナンスが困難になり、さらに多くの問題が発生します。

3D でのこれに対する提案やアイデアは何ですか? 2 つのシステム (2D 座標と 3D 座標とエンティティ) を実際に変換する唯一の方法はありますか? または、これを達成するためのより洗練された方法はありますか?

-1 つのピクセルで複数のサンプルをレンダリングすると便利なのはなぜですか? データセットをよりよく表しているためです。1 つのピクセルについて、値 2、5、および 8 があるとします。一部のサンプル省略アルゴリズムにより、5 のみが描画されます。線は 5 にのみ移動し、8 には移動しないため、データが歪んでいます。反対のことを主張することもできますが、問題は、最初の引数が使用するデータセットに関係するということです。これこそが、サンプルを省略できない理由です。

4

12 に答える 12

6

tgamblin の回答の裏で、サンプルを省略できないというあなたの主張についてコメントしたいと思います。

画面に描画するデータは、サンプリングの問題と考える必要があります。あなたは 240 万ポイントのデータについて話しているのですが、それを数千ポイントしかない画面に描画しようとしています (少なくとも、30fps のリフレッシュ レートを心配しているので、そうだと思います)。

つまり、x 軸のすべてのピクセルに対して、必要のない 1000 ポイントの順序でレンダリングしていることを意味します。GPUを利用する道をたどったとしても(たとえば、openglを使用して)、表示されない行に対してGPUが実行する必要がある多くの作業です。

サンプル データを提示するために私が使用した手法は、レンダリングのためだけに、セット全体のサブセットであるデータ セットを生成することです。x 軸の特定のピクセル (つまり、特定の x 軸の画面座標) に対して、最小 y、最大 y、左端 y、右端 yの絶対最大 4 ポイントをレンダリングする必要があります。これにより、有効にレンダリングできるすべての情報がレンダリングされます。最小値と最大値が引き​​続き表示され、隣接するピクセルとの関係が保持されます。

これを念頭に置いて、x 軸の同じ​​ピクセルに収まるサンプルの数を計算できます (データの「ビン」と考えてください)。特定のビン内で、最大値、最小値などの特定のサンプルを決定できます。

繰り返しますが、これは表示に使用されるサブセットにすぎず、表示パラメータが変更されるまでのみ適切です。例えば。ユーザーがグラフをスクロールしたりズームしたりした場合は、レンダー サブセットを再計算する必要があります。

opengl を使用している場合はこれを行うことができますが、opengl は正規化された座標系を使用するため (また、実際の画面座標に関心があるため)、データ ビンを正確に決定するには、もう少し手間がかかる必要があります。これは、opengl を使用しない方が簡単ですが、グラフィック ハードウェアの利点を十分に活用できません。

于 2008-10-21T22:36:24.137 に答える
5

必要がなければ、Z 軸について心配する必要はありません。OpenGL (たとえば) では、XY 頂点 (暗黙の Z=0 を使用) を指定し、zbuffer を回転させ、非射影射影行列を使用し、さっさと 2D にいることができます。

于 2008-10-20T20:58:53.413 に答える
5

科学的な視覚化のための非常に人気のあるツールキットはVTKであり、あなたのニーズに合っていると思います:

  1. これは高レベルの API であるため、OpenGL を使用する必要はありません (VTK は OpenGL の上に構築されています)。C++、Python、Java、および Tcl 用のインターフェイスがあります。これにより、コードベースがかなりきれいに保たれると思います。

  2. あらゆる種類のデータセットを VTK にインポートできます (医療画像から金融データまで、数多くの例があります)。

  3. VTK は非常に高速で、非常に大きな視覚化を行いたい場合は、VTK グラフィックス パイプラインを複数のマシンに分散できます。

  4. それにかんする:

    これにより、1 つの画面で約 25M のサンプルをレンダリングできます。

    [...]

    これは科学的なデータであるため、サンプルを省略することはできません。真剣に、これはオプションではありません。それについて考え始めることさえしないでください。

サンプリングと LOD モデルを使用して、VTK で大規模なデータセットをレンダリングできます。つまり、遠くから見ると低解像度バージョンが見えるモデルがありますが、ズームインすると高解像度バージョンが表示されます。これは、大規模なデータセットのレンダリングの多くが行われる方法です。

実際のデータセットからポイントを削除する必要はありませんが、ユーザーがズームインしたときに確実に段階的に改善できます。ユーザーがすべてを処理できない場合、2500 万ポイントを 1 つの画面にレンダリングしても意味がありません。データ。VTK ライブラリと VTK ユーザー ガイドの両方を参照することをお勧めします。大規模なデータセットを視覚化する方法に関する非常に貴重な情報がそこにあるからです。

于 2008-10-20T21:09:25.453 に答える
3

Mark Bessey mentioned it, that you might lack the pixels to display the graph. But given your explanations, I assume you know what you are doing.

OpenGL has an orthogonal mode that has a z-coordinate inside (0;1). There is no perspective projection, the polygons you draw will be planar to the screen clipping area.

DirectX will have similar. On OpenGL, it's called gluOrtho2d().

于 2008-10-20T21:04:07.380 に答える
2

OpenGL is happy to render 2D if you setup the projection to be Ortho (no z). Also you should decimate your data. Rendering the same pixel 1000 times is a waste of GPU. Spend your time upfront with a performat multi-thread decimator. The be sure to blast large arrays at the GPU using vertex arrays or vertex buffer objects (clearly I'm an OpenGL kinda of guy)

于 2008-10-20T21:02:28.383 に答える
1

VTK を直接使用することに加えて、VTK に基づいて構築された 2 つの製品があり、興味があるかもしれないことを指摘したいと思います。

1) ParaView (paraview.org) は、VTK の上に構築されたユーザー インターフェイスであり、科学的な視覚化製品をより簡単にします。それを処理するハードウェアがあれば、必要なすべてのデータをレンダリングでき、複数のプロセッサ/コア/クラスターの MPI をサポートします。ユーザーが作成したプラグインを介して拡張可能であり、プロジェクトの構築とコンパイルに自動化されたツールを使用します。

2) ParaViewGeo (paraviewgeo.mirarco.org) は、私が働いている会社によって作成された ParaView の地質学および鉱業探査派生物です。Gocad、Datamine、Geosoft、SGems など、ParaView がサポートしていないファイル形式の読み取りをサポートしています。さらに重要なことは、有限要素/離散要素モデリングを行っているグループとの最近の作業のように、マイニング成果物と緩やかに結びついている科学的 Viz に関心を持つ他のグループと一緒に仕事をすることがよくあることです。チェックしてみる価値があるかもしれません。

どちらの場合も (PV と PVG)、データはそのデータのビューとは別のものと見なされます。そのため、すべてのデータを「レンダリング」することはありません (そうするのに十分な大きさのモニターがない可能性が高いため)。ただし、期待どおりにデータセットからすべて「そこに」処理されますのでご安心ください。データに追加のフィルターを実行すると、表示できるものだけが「レンダリング」されますが、フィルターはすべてのデータを計算します。すべてのデータが一度に表示されるわけではありませんが、すべてがメモリに存在します。

数値を探している場合は、今日、PVG で 800 万セルの 3 つの規則的なグリッドを計算しました。1 つは 7 タプルのベクトル プロパティ (7x 800 万の double 値) を含み、他の 2 つはそれぞれスカラー プロパティ (1x 800 万の double 値) を含み、合計 7200 万の double 値がメモリに格納されました。メモリ フットプリントは 500MB 近くだったと思いますが、400,000 個のポイント セットもあり、各ポイントには 7 タプルのベクトル プロパティがあり、その他のさまざまなデータも利用可能でした。

于 2008-12-09T03:17:55.483 に答える
1

これにより、1 つの画面で約 25M のサンプルをレンダリングできます。

いいえ、本当に大きな画面を持っていない限り、そうではありません。画面の解像度がおそらく 1,000 ~ 2,000 ピクセル程度であることを考えると、データをグラフ化する前にデータをデシメートすることを検討する必要があります。1 行あたり 1,000 ポイントで 100 行をグラフ化することは、パフォーマンスに関しては、おそらく大きな問題にはなりません。

于 2008-10-20T20:57:30.750 に答える
1

3D を直接扱っているためにコードが読めなくなった場合は、すべての 3D OpenGL をカプセル化し、2D データをアプリケーションにとって便利な形式で取得する薄いアダプター レイヤーを作成する必要があります。

私が何かを見逃していたら、私を許してください。合唱団に基本的なオブジェクト指向設計を説いています。言ってるだけ'...

于 2008-10-20T21:15:09.713 に答える
1

実際のデータセットからポイントを削除する必要はありませんが、ユーザーがズームインしたときに確実に段階的に改善できます。ユーザーがすべてを処理できない場合、2500 万ポイントを 1 つの画面にレンダリングしても意味がありません。データ。VTK ライブラリと VTK ユーザー ガイドの両方を参照することをお勧めします。大規模なデータセットを視覚化する方法に関する非常に貴重な情報がそこにあるからです。

どうもありがとうございました。これはまさに私が探していたものです。VTK もハードウェアを使用して、この種のレンダリングをオフロードしているようです。ところで、私はあなたが価値があることを意味すると思います;)。第二に、ユーザーは私が与えた例の情報を取得します。ただし、それほど簡潔ではありませんが、データの概要は科学者にとって本当に純金になる可能性があります. ユーザーのためにすべてのデータを処理することではなく、レンダリングから貴重な情報を取得することです。データセットの非常に「縮小された」表現であっても、ユーザーはこれを行うようです。

他に提案はありますか?

于 2008-10-20T21:17:12.160 に答える
0

参考になるかわかりませんが、時間を次元として使用していただけますか? つまり、1 フレームは 1 z ですか? おそらく、それは物事をより明確にするかもしれませんか?次に、デルタを効果的に適用して (つまり、z 軸上で) 画像を構築できますか?

于 2008-10-20T20:57:09.377 に答える
0

No you don't, not unless you've got a really really large screen. Given that the screen resolution is probably more like 1,000 - 2,000 pixels across, you really ought to consider decimating the data before you graph it. Graphing a hundred lines at 1,000 points per line probably won't be much of a problem, performance wise.

First of all, we cannot omit any samples when rendering. This is impossible. This would mean the rendering is not accurate to the data the graph is based on. This really is a no-go area. Period.

Secondly, we are rendering all the samples. It might be that multiple samples end up on the same pixel. But still, we are rendering it. The sample data is converted on the screen. Thus, it is rendered. One can doubt the usefullness of this visualized data, byt scientists (our customers) are actually demanding it we do it this way. And they have a good point, IMHO.

于 2008-10-20T21:03:44.170 に答える
0

Wrap the library in a gentler, kinder 2D library with the Z and rotations all set to 0.

-Adam

于 2008-10-20T21:04:53.260 に答える