質問

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

当然、利用可能なすべてのテクニックを使用してレンダリング時間を改善したいと考えています。マルチコア、事前レンダリング、キャッシュはすべて非常に興味深いものですが、それを削減するものではありません。これらのデータセットで少なくとも30FPSのレンダリングが必要です。60FPSが望ましいです。今、これは野心的な目標です。

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

問題は次のとおりです。OpenGL、DirectX、XNAなどのGPU APIは、3Dシーン向けに作られています。したがって、それらを使用して2D線グラフをレンダリングすることは可能ですが、理想的ではありません。開発したコンセプトの証明で、2Dの世界を3Dの世界に変換する必要があることに気付きました。突然、多角形、頂点、その他の優れたXYZ座標系を操作する必要があります。これは、開発の観点からは理想とはほど遠いものです。コードは読めなくなり、メンテナンスは悪夢であり、さらに多くの問題が発生します。

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

-1つのピクセルに複数のサンプルをレンダリングすると便利な理由 データセットをより適切に表しているためです。 1つのピクセルで言うと、値は2、5、8になります。アルゴリズムを省略したサンプルがあるため、5だけが描画されます。行は8にではなく、5にしか行かないため、データは歪められます。あなたも反対を主張することができますが、問題の事実は、最初の引数が作業するデータセットにカウントされるということです。 これがまさにサンプルを省略できない理由です。

役に立ちましたか?

解決

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

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

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

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

  4. に関して:

      

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

         

    [...]

         

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

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

実際のデータセットからポイントを削除する必要はありませんが、ユーザーがズームインすると確実に段階的に調整することができます。すべてのデータを処理します。大きなデータセットを視覚化する方法に関する貴重な情報があるため、VTKライブラリとVTKユーザーガイドの両方をご覧になることをお勧めします。

他のヒント

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

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

つまり、x軸のすべてのピクセルに対して、必要のない1000ポイントのオーダーでレンダリングします。たとえあなたがgpuを利用する道をたどったとしても(例えば、openglの使用を通して)、それはまだ見えない行のためにgpuがしなければならない多くの仕事です。

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

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

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

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

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

Mark Besseyは、グラフを表示するためのピクセルが不足している可能性があると述べました。しかし、あなたの説明を考えると、あなたはあなたが何をしているのか知っていると思います。

OpenGLには、z座標が内部(0; 1)の直交モードがあります。透視投影はありません。描画するポリゴンは、スクリーンクリッピング領域に対して平面になります。

DirectXも同様です。 OpenGLでは、gluOrtho2d()と呼ばれます。

OpenGLは、投影を直交(zなし)に設定すると、2Dをレンダリングできます。また、データを間引く必要があります。同じピクセルを1000回レンダリングするのはGPUの無駄です。 performatマルチスレッドデシメータで時間を前もって過ごしてください。頂点配列または頂点バッファーオブジェクトを使用して、GPUで大きな配列を爆破してください(明らかにOpenGLの一種です)

  

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

いいえ、そうではありません。本当に大きい画面を持っているのでなければ。画面の解像度はおそらく1,000〜2,000ピクセルに近いため、データをグラフ化する前に間引くことを検討する必要があります。 1行あたり1,000ポイントで100行をグラフ化することは、パフォーマンス上、おそらくそれほど問題にはなりません。

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

何か見落とした場合はご容赦ください。聖歌隊に基本的なオブジェクト指向のデザインを説教しています。ただ言って...

  

実際のデータセットからポイントを削除する必要はありませんが、ユーザーがズームインすると確実に段階的に調整することができます。すべてのデータを処理します。大きなデータセットを視覚化する方法に関する貴重な情報があるため、VTKライブラリとVTKユーザーガイドの両方をご覧になることをお勧めします。

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

その他の提案?

VTKを直接使用することに加えて、VTKをベースに構築された2つの製品があり、興味があるかもしれません。

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

2)ParaViewGeo(paraviewgeo.mirarco.org)は、私が働いている会社が生産したParaViewの地質学および鉱業探査の派生物です。 GoView、Datamine、Geosoft、SGemsなど、ParaViewがサポートしていないファイル形式の読み取りをサポートしています。さらに重要なことは、有限要素/離散要素モデリングを行うグループとの最近の研究のように、科学的ビズに興味のある他のグループと、大まかに結びついた成果物で作業することが多いことです。チェックアウトする価値があるかもしれません。

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

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

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

  

いいえ、そうではありません。本当に大きな画面を持っている場合を除きます。画面の解像度はおそらく1,000〜2,000ピクセルに近いため、データをグラフ化する前に間引くことを検討する必要があります。 1行あたり1,000ポイントで100行をグラフ化することは、パフォーマンス上、おそらくそれほど問題にはなりません。

まず、レンダリング時にサンプルを省略できません。不可能だよ。これは、グラフが基にしているデータに対してレンダリングが正確でないことを意味します。これは本当に立ち入り禁止区域です。期間。

次に、すべてのサンプルをレンダリングしています。複数のサンプルが同じピクセルで終わる可能性があります。しかし、それでもレンダリングしています。サンプルデータは画面上で変換されます。したがって、レンダリングされます。この視覚化されたデータの有用性を疑うことができます。科学者(お客様)は、実際にこの方法でそれを要求しています。そして、彼らには良い点があります、私見。

Zと回転をすべて0に設定した、より穏やかでやさしい2Dライブラリでライブラリをラップします。

-アダム

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top