2011-08-03 11 views
5

UDPソケット上で4次元の点データを取得し、6つの別々の2D散布図にプロットするプログラムをC++で作成しています。たとえば、A、B、C、Dの名前を付けると、AxB、AxC、AxD、BxC、BxD、CxDの6つの2次元プロットが作成されます。数時間かけて、プログラムは〜50Kポイントを獲得します。OpenGLを使用してC++で多くのデータポイントを持つ散布図を描画する最良の方法

現在、イミディエイトモードを使用して各ポイントを1回プロットします。描画呼び出しの間にバッファをクリアしないので、以前にプロットされた点は、バッファがクリアされるまで存続します。私は即時モードが遅く、廃止予定であるため、この方法に満足していません。ウィンドウをサイズ変更するときと同じように、バッファをクリアする必要があるとき、以前にプロットされたすべてのデータが失われます。私は、バッファがクリアされた後にデータの永続化を可能にするソリューションを考え出したいと思います。さらに、プロットがウィンドウのサイズ変更も容易に行えればいいと思う。

私は各座標系の頂点配列(2次元で)を維持することを考えましたが、それは6個の別個の配列を必要とし、4次元すべての配列を維持するために3倍のメモリが必要です。

私は正しい方法でこれについて考えていますか?この問題の適切な解決策は何ですか?

最後の目標は、できるだけリアルタイムでデータを表示するアプリケーションを作成することです。

編集彼らが来るように、1つずつポイントをプロット継続することが可能であろう、と私はサイズを変更する必要があるときに、画面は、画面の画像を取得し、その画像のサイズ変更されたバージョンを表示しますか?

答えて

5

頂点バッファの使用描画するジオメトリをグラフィックカードのメモリに直接格納できるため、オブジェクトを使用すると速度のレンダリングが向上します。しかし、あなたのケースでは、データが常に変更された場合、データが変更されるたびにVertex Arrayオブジェクトを再構築する必要があるため、このメソッドが即時モードより速いかどうかはわかりません。ポイントを追加するだけの場合は、複数のVBOを作成してポイントをグループ化し、最後に受信したポイントを即時モードでレンダリングして新しいグループを作成することができます。たとえば、100054ポイントを受け取った場合、10000ポイントの10グループを作成し、直近の54ポイントを即時モードでレンダリングすることができます。

メモリの問題については、グラフィックカードの頂点に4つの要素を格納することができます。頂点のどのコンポーネントをレンダリング座標として使用するかを選択するさまざまな頂点シェーダを使用できます。この手法を使用すると、メモリ使用量は受信したデータの2倍になります.1つは受信データ、もう1つは頂点バッファオブジェクトです。

+2

VBOは少なくともクライアント側の配列より遅くならず、確実に即時モードより高速です。メモリコピーだけでなく、VBO(および頂点配列一般)が必要とするドライバコールオーバーヘッドもあります。 –

+0

異なるビューに対して異なる頂点シェーダを持つ必要はなく、 'glVertexPointer'の' stride'引数と 'pointer'引数を変更することで、おそらくなくなります。 – user786653

+0

@Christianコメントありがとうございます、私はそれについては分かりませんでした。 – neodelphi

関連する問題