2009-06-04 21 views
0

C#のlanにビットマップオブジェクトを転送する最速の方法が必要です。ビットマップオブジェクトをlanに転送する最も良い方法

アブドゥル・ハリク

+2

もっと具体的に教えてください。私が思うことは分かります。「ジップしてメールしてください」が、それはあなたが聞きたいことではないことです。 – Natrium

+0

私は、画面キャプチャのインスタンスを言うビットマップオブジェクトを持っています。私はそれをランを介して転送する必要があります。私は、それをシリアル化したり、バイナリ形式で送るなど、最速の方法を教えてください。 –

答えて

0

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

thisリンクにも素晴らしい解決策があります。

4

言葉は「最高の」あなたはスピードの話をしている場合、それはビットマップがどのようにビッグに依存して、最高の状態で、

:-)主観的な用語です。 LANが100Mbpsで動作している場合、10MBのファイルごとに約1秒ほどの時間がかかることがあります。小さなファイルの場合はそのまま転送してください。いくつかのファイルサイズでは、ファイルを圧縮して転送し、もう一方の端で解凍する価値があります。これは、CPUの不法行為がネットワーク不法行為よりも速いためです。

しかし、私は貴重なコーディングをするにはかなり大きなファイルについて話していると思います。

更新:あなたがスクリーンキャプチャフレームについて話すので

、我々は1280×1024、32bppモードにいるとしましょう。フルスクリーンが5Mを占め、100MbpsのLANで1秒以内に転送可能でなければなりません(他のネットワークトラフィックは許可されています)。私の意見では、圧縮のオーバーヘッドが時間の節約を上回るので、それ以上のスピードアップを試してみる価値はありません。

ビデオの転送を行う場合は、別の問題です。次に、すべてのフレームに新しいイメージを送信することはありません。デルタを使い、その情報だけを転送します。画面が一般的に少ししか変化しないという事実に頼っています。

これは、画像をどのように使用するかによって異なります。ワンショットの画面キャプチャは、バイナリ情報を送信するだけです。それ以外のものは、私たちにもっと詳しく説明する必要があります。

動画転送については、実際にはさまざまな圧縮方式で作業を行っています。

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

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

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

私たちが使用した他の方法の1つは、変更された最上部と最下部の最もピクセル位置を単純に格納し、それらの2つの値をそれらによって囲まれた矩形全体とともに転送することでした。

他の方法がありますが、最小のデルタサイズを確保するためにメソッドをフレームごとに動的に選択することは間違いありません。

+0

ビットマップオブジェクトはほぼ3000 KBのサイズであり、スクリーンキャプチャのように非常に頻繁にそれを送信する必要があります。 11秒間に11個のビットマップオブジェクトを送信することを検討してください。最速の方法は何ですか? –

+1

アップデートを参照してください。すべてのフレームでフルスクリーンダンプを送信すべきではありません。アルゴリズムを使用して、画面のどの部分が変更されたかを検出し、デルタのみを送信します。 – paxdiablo

+0

私たちは既に、画面上のデルタを計算するためにミラードライバを使用しています。また、LANを介して送信されるビットマップオブジェクトの数をさらに減らすために、ユニオンと交差を使用しています。問題はデルタを計算することではなく、効率的にデルタをlan上で転送する方法です。 –

関連する問題