.NET Frameworkを使用して大量の2Dグラフィックオブジェクトを視覚化する(複雑な構造のスキーマを描画する)必要があります。たとえば、1つのキャンバスに1万から2万のプリミティブがあります。それぞれのハードウェア(マルチコアCPU、大量のRAM、最近のビデオカードを備えた強力なサーバーPC)があると仮定します。書籍とMSDNによると、解決策は、ハードウェアアクセラレーション、特に図面サブシステムでWPFを使用することです。GeometryDrawingsとVisualHostを使用して単純なシナリオを実装しましたが、かなり適切ですが、問題があります。視覚化されたオブジェクトは、状態を変更し(つまり、再描画せずに色をすばやく変更する)、マウスイベントを受け入れる(クリック、ドラッグアンドドロップ)必要があります。 )フレームワーク要素ではないため、Freezablesはサポートしていません。問題を最も効率的に解決する方法はありますか?私たちのグラフィカルオブジェクトは、フレームワークが提供するShapeとその子孫に非常によく似ていますが、パフォーマンス要件とは一致しません。
*編集*
グラフィックオブジェクトは、複雑なもの(パスを含む複数のネストされたオブジェクト-ランダムな形状の曲線)と同じくらい単純な構造(赤い長方形)を持つことができます。オブジェクトが重なる場合があります。レイヤリング(特定の瞬間に特定のオブジェクトを表示および非表示にする)は、追加機能として後で実装される場合があります。状態の変化は、外部イベントによってトリガーされ、2〜5秒に1回発生する場合があります。
2 に答える
一言:シェーダー。
これは、WPFでシェーダーを使用するための適切なチュートリアルのように見えます。PixelシェーダーとVertexシェーダー自体は、プリミティブを描画するのに非常に簡単です。
シェーダーを使用すると、ハードウェアアクセラレーションを最大限に活用できます。まともなGPUでは、10kプリミティブは何もありません。
このコンテキストでは、フレームごとに色などを変更することは簡単です。
シェーダーチュートリアルのほとんどは3D用ですが、2Dにも適用できます。
XNAもご覧ください。DirectXコンテキストをWPFまたはWinformsウィンドウ内に配置することはネイティブでサポートされていませんが、それに関するチュートリアルもかなりあります。XNAは非常に強力で、行列操作などの必要な多くの定型コードを処理します。XNAを使用しないことにした場合でも、create.msdn.comのチュートリアルは非常に教育的です。
2012年10月更新
XNAは事実上死んでいますが、WPFでシェーダーを使用する例はかなりあります。C ++のスキルが十分であれば、D3DImageクラスを使用して、WPFフォームにDirect3Dウィンドウを配置できます。XNAサンプルは、シェーダーコンテンツとグラフィックス開発への高レベルのアプローチにとって依然として価値があります。
XNAに興奮している場合は、順調に進んでいるMonoGameをご覧ください。私はそれをいくつかのクロスプラットフォームの3Dのもの(Win7、OSX、iOS)でうまく使用しており、不満はありません。
描画の実行方法と再描画される領域を詳細に制御する必要がある場合は、GDI +(WinFormsで使用)を使用してください。
GDI +を使用してビットマップオブジェクトに描画し、変更されたときにその任意の部分を再描画できます。
AFAIK GDI +はハードウェアアクセラレーションではないので、簡単なベンチマークを行います。私の感じでは、あなたの場合はもっと速くなるでしょう。