0

C#でLANを介してビットマップオブジェクトを転送する最速の方法が必要です。

アブドゥル・ハリク

4

2 に答える 2

4

「最高」という言葉は、せいぜい主観的な用語です:-)

速度について話している場合は、ビットマップの大きさによって異なります。100Mbps で動作する LAN では、10MB のファイルごとに約 1 秒かかると予想できます。小さなファイルの場合は、そのまま転送してください。ファイルサイズによっては、ファイルを圧縮して送信し、相手側で解凍する価値があります。これは、CPU のノイズがネットワークのノイズよりも高速であるためです。

しかし、その余分なコーディングを価値のあるものにするために、かなり大きなファイルについて話していると思います。

アップデート:

スクリーン キャプチャ フレームについて話しているので、1280x1024、32bpp であるとしましょう。フルスクリーンは 5M を占めますが、これは 100Mbps LAN で 1 秒以内に転送できるはずです (他のネットワークトラフィックが許せば)。私の意見では、圧縮のオーバーヘッドが時間の節約を上回るため、これ以上速度を上げようとする価値はありません。

ビデオ転送を行う場合、それは別の問題です。次に、フレームごとにまったく新しい画像を送信するのではなく、画面が通常フレームごとに少しだけ変化するという事実を利用して、デルタを計算し、その情報のみを転送します。

画像を何に使用するかによって異なります。ワンショットのスクリーン キャプチャです。バイナリ情報を送信するだけです。それ以外の場合は、詳細をお知らせください。

ビデオ転送については、実際にさまざまな圧縮方法でいくつかの作業を行いました。

最も簡単な方法は、画面を (たとえば) 16x16 のマトリックスに分割し、変更された要素のみを送信することです。

したがって、たとえば、各フレームは、どの要素が変更されたかを示す 256 ビットのビットマスクで構成されます。次に、そのビットマスクの後に要素自体が続きます。

このアルゴリズムは、最小フレーム デルタが 32 バイトであることを意味します (画面が変更されていない場合)。最大のものは、全画面ダンプよりわずか 32 バイト大きいだけです。

私たちが使用した他の方法の 1 つは、変更された左上と右下のピクセル位置を単純に保存し、これら 2 つの値と、それらに囲まれた四角形全体を転送することでした。

フレームごとに動的に方法を選択して、最小のデルタ サイズを確保するなど、他にも使用できる方法があることは間違いありません。

于 2009-06-04T06:33:38.867 に答える
0

これは、CopyFromScreen() の .NET V2.0 SP1 および .NET 3.5 バージョンのバグです。ハンドルがリークします。しばらくすると、使用可能なハンドルが不足し、このような奇妙なエラー メッセージが表示されます。現在の状態では使用できません。P/Invoking Windows API 関数による別の方法については、このスレッドを確認してください。

また、このリンクには素晴らしい解決策があります。

于 2009-12-14T06:24:00.970 に答える