4

DirectX 9 をラップし、2D ピクセル レベルの描画を実行するための簡素化されたインターフェイスを提供する C# コントロールを作成しています。.NET では、このコードを unsafe コード ブロックでラップし、allow unsafe code オプションを指定してコンパイルする必要があります。

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

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

(これが 2008 年であることはわかっており、DirectX 3D、OpenGLなどを使用する必要がありますが、このコントロールは 2D ピクセル レンダリング専用であり、3D レンダリングは必要ありません。)

4

4 に答える 4

5

アンセーフ ポインターを使用することは、C# でメモリを直接操作するための最速の方法です (Marshal ラッパー関数を使用するよりも確実に高速です)。

好奇心から、どのような 2D 描画操作を実行しようとしているのですか?

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

DirectX は、大きな三角形を描画してイメージを変換する場合 (四角形にマップされたテクスチャ) には大きな利点がありますが、単一のピクセル操作ではそれほど優れたパフォーマンスを発揮しません。

.NET ランドにとどまる場合、1 つの代替方法は、Bitmap オブジェクトを保持してサーフェスとして機能させ、LockBits を使用し、返された BitmapData オブジェクトの unsafe ポインターを介してピクセルに直接アクセスすることです。

于 2008-09-13T20:41:18.503 に答える
3

はい、それがおそらく最速の方法です。

数年前、2 つの 1024x1024 の画像をピクセル レベルで比較する必要がありました。get-pixel メソッドには 2 分かかり、unsafe スキャンには 0.01 秒かかりました。

于 2008-09-25T04:27:26.207 に答える
3

また、その性質のものを高速化するために unsafe を使用しました。控えめに言っても、パフォーマンスの向上は劇的です。ここでのポイントは、安全ではないということは、自分が何をしているのかを知っている限り、不要かもしれない多くのことを無効にするということです。

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

于 2008-12-18T13:57:09.637 に答える
1

私は最近、シン クライアント アプリ (C#) の 1 つの単純なヒストグラム コントロールの作成を任されました。私が分析していた画像は約 1200x1200 で、同じルートをたどらなければなりませんでした。問題なくオブジェクトを 1 回描画することはできましたが、コントロールはサイズ変更可能である必要がありました。私はそれを避けようとしましたが、生のメモリ自体を取得する必要がありました.

標準の .NET クラスを使用することが不可能だと言っているわけではありませんが、最終的にはうまくいきませんでした。

于 2008-09-11T07:51:23.567 に答える