2008-09-11 12 views
4

私はDirectX 9をラップするC#コントロールを作成しており、2Dピクセルレベルの描画を実行するための簡単なインターフェイスを提供しています。 .NETでは、このコードを安全でないコードブロックにラップし、安全でないコードを許可するオプションでコンパイルする必要があります。2Dレンダリングの安全でないC#とポインタ、良いか悪いですか?

私は、メモリのロックされた領域へのポインタを返す表面全体をロックしています。次に、「単純な」ポインタ演算を使用してピクセルデータを直接書き込むことができます。私はこれをテストしたパフォーマンスを持っていて、私が知っている他の "安全な"方法よりも大幅にスピードが向上しています。

これはC#.NETアプリケーションの個々のピクセルを操作する最も速い方法ですか?より良い、より安全な方法がありますか?ポインター操作を必要としない同等の速いアプローチがあった場合は、それを使用することが私の好みです。

(私はこれが2008年で知っていると我々はすべてなど、DirectXの3D、OpenGLを使用しなければならない、しかし、この制御は、2Dピクセルレンダリングのために排他的に使用されるべきであり、単に3Dレンダリングを必要としません。)

答えて

4

安全でないポインタを使用するのは、C#でダイレクトメモリ操作を行う最速の方法です(Marshalラッパー関数を使用するよりはるかに高速です)。

好奇心の邪魔をして、どのような種類の2D図面操作を実行しようとしていますか?

ピクセルレベルの操作を行うためにDirectXサーフェイスをロックすると、DirectXを使用して得ようとしているほとんどのハードウェアアクセラレーションの利点が失われるためです。また、ターミナルサービス(リモートデスクトップ)でDirectXデバイスを使用すると、DirectXデバイスが初期化されないため、このシナリオではコントロールが使用できなくなります(これは問題ではありません)。

大きな三角形や画像(テクスチャを四角形にマッピング)を描画する場合、DirectXは大きな勝利になりますが、単一のピクセル操作ではあまり効果がありません。

.NET土地に留まる代わりに、LockBitsを使用して返されたBitmapDataオブジェクトの安全でないポインターを介してピクセルに直接アクセスして、ビットマップオブジェクトをサーフェスとして機能させることができます。

1

私は最近、シンクライアントアプリケーション(C#)のための簡単なヒストグラムコントロールを作成することが任されました。私が分析していた画像は約1200x1200で、私は同じ道を進む必要がありました。私は問題を一度だけ引き出すことができましたが、コントロールはサイズ変更が必要でした。私はそれを避けようとしましたが、生の記憶そのものに着く必要がありました。

標準の.NETクラスを使用することは不可能ではありませんが、私はそれを最後までやることはできませんでした。

2

はい、おそらく最も速い方法です。

数年前、ピクセルレベルで2枚の1024x1024画像を比較する必要がありました。ピクセル取得方法は2分かかり、安全でないスキャンは0.01秒かかりました。

3

私はまた、その性質のものをスピードアップするために安全でないものを使用しました。パフォーマンスの改善は劇的で、言い表せません。ここでのポイントは、安全でないことは、あなたが何をしているかを知っている限り、必要でない可能性のある束をオフにすることです。

また、DirectDrawをチェックしてください。 DirectXの2Dグラフィックスコンポーネントです。それは本当に速いです。

関連する問題