2011-07-06 16 views
1

私は、各ビットマップを〜50msごとに計算して、ピクチャボックスにペイントしてフォームに表示する必要があるソングのビジュアライゼーションを構築しています。XNA/DirectXを使用したDrawImage/DrawLine

残念ながら、DrawImage/DrawLineを使用すると、この画像のレンダリング/ペイントパフォーマンスが高速になりません。

XNA/DirectXを使用して改善する方法はありますか?

どちらがこのタスクに適していますか?

例はありますか?

答えて

2

XNAはバックグラウンドでDirectXを使用します。 XNAのためにManagedDXが廃止されたので、C#で直接DirectXを直接使用することもできません。例えば、slimdxでも選択肢があります。 XNAはdirectxを使用するエンジンに近い。必要なのは、描画パフォーマンスが実際の問題ではなく、管理されたメモリ操作であるような、より低レベルのアプローチです。ハードウェアアクセラレーションを使用し、2Dレンダリングに適したDirect2D(Slimdxの一部)を使用することをお勧めします。また、thisを試して、手でビットマップを操作することもできます。

+0

実際、サードパーティのフレームワークを使用しないと直接的な解決策はありませんか? – nr1

+0

@ nr1 XNAはファーストパーティのフレームワークです。 WinFormsでXNAを使用する方法の例については、App HubでXNA WinFormsのサンプルを参照してください。 –

+0

@ Nr1最後のリンクを参照してください。まだビットマップに直接書き込むことができます。私はあなたの問題が描画パフォーマンスではなく、管理されたメモリにアクセスして変更する方法だけであることは確かです。あなたはXNA、SlimDXなどを使ってイメージを塗りつぶすオーバーヘッドをたくさん得ます...適切な最適化をすれば、普通のビットマップを使って達成できると確信しています。もちろん、ビットマップの大きさに依存します。 – dowhilefor

0

winformsサンプルと同様の方法でxnaを使用することに同意します。

ビットマップをレンダリングしたり、SpriteBatchを使うのではなく、すべてのラインのすべての端点を含む動的な頂点バッファを作成することで、ラインの外観とパフォーマンスが最適になると思います。その後、DrawUserPrimitives()を使用し、PrimitiveType.paramをPrimitiveType.LineListに指定します。

これはGPUにすべての種類のエフェクト(シェーダ)を作成できるGPUにすべてのポイントを送信しますが、GPUはすべての重い作業を行います。

アプリハブの教育部門のサンプルの中には、この種のレンダリングを使用してグリッドを作成するものがあります。気になるものはperPixelLighting sampleです。あなたは、ある程度3D空間で作業する必要があるかもしれません。