2012-02-24 27 views
0

デニズェンスのスタックオーバーフロー私はあなたの知識が必要です。私はWPFと基本的なC#.NETソケット通信を利用したビデオ処理システムに取り組んでいます。各クライアントは、毎秒30フレームのビデオデータをLAN環境を介してサーバーに送信して処理します。処理の一部は、サーバー負荷を軽減するために各クライアントによって処理されます。スレッド通信とオブジェクトオーバーヘッド

私は、ハードウェアの制限が一度も懸念されていない環境でプログラミングを学びました。ビデオはそれを変えます.. "こんにちはワールド"は、私がこれを最小限に抑えるために私を準備していませんでした。これらの2つの将来の方法のいずれかの実施は深刻な問題ではない。私が時間とエネルギーを捧げるべきかどうかの判断は、私が援助を必要とする場所です。 (!しかし、提案を開いて)

私は2つのオプションがあり、ハードウェアを想定しては、可能な限りリアルタイム結果に近い生産からクライアントを制限します。

--Queued Client-- クライアントは、ビデオフレームのキューを処理します。各フレームは処理され、さらに解析するためにTCPパケットを介してサーバーに送信されます。このシステムは、センサキャプチャの順番で一度に1つのフレームのみを処理し、静的ソケットクライアントを介してサーバに送信します。 *このシステムは、最新のマルチコアハードウェアを利用できません。

- スレッドクライアント クライアントは、スレッド化された(バックグラウンドワーカー)処理と各フレームのサーバーへの送信を利用します。各新しいフレームは、新しい処理スレッドと、新しいネットワーク通信クラスのインスタンス生成をトリガします。 *このシステムは最新のハードウェアを使用していますが、タイミングの問題が深刻な場合があります。

私のお問い合わせの心に、スレッド通信はほとんど順序付け通信を生成しますか?私はすでに、サーバー側のクライアント間でビデオフレームを同期する予定です...しかし、新しい問題を作成するためには、データの配信は今のところ順調に進んでいませんか?これがローカルネットワークを介した通信であることを思い出してください。

新しいソケット通信クラスと新しい(シンプルな)ビデオ処理クラスをインスタンス化すると、各フレームを並行してキューに入れたり処理したりしないでください。

コードはちょうど形を取っています。クライアントシステムのハードウェアは不明であるため、そのパフォーマンスを判断することはできません。どのように開発を進めますか?

私は大学生です。そのような入力は私の知識の私の実際の世界のアプリケーションの設計に私を助ける。

+0

お読みください:http://msdn.microsoft.com/en-us/library/ff963548.aspxには、あなたのケースに関する情報が満載です。あなたの場合、パラリスは完全に合理的です。イメージのアップロードとソースからの取得にはかなりの時間がかかりますので、これらのタスクを独立したコンテキスト(スレッド)で完全にオフロードできます。与えられたリンクを読み、あなたのケースでは同期のために素晴らしいプロデューサー/コンシューマーコレクションを探します。 – Polity

+0

パイプライニングは良いサウンドで、同じような順序の実行時間を持つステージの場合はそうです。残念なことに、ビデオのストリーミングと処理には、しばしばCPU負荷の面で支配的な段階があります。これは効果的なボトルネックです。パイプの狭い部分です。この段階で複数の細いパイプを使用できる場合を除き、余裕のある細いパイプがあるにもかかわらず、ストリームは押さえつけられます。 –

答えて

0

"is performance of XXXXXX enough"に有効な応答は1つだけです。試して測定してください。あなたのケースでは

あなたはへ/サーバから

  • ネットワークトラフィックを見積もる必要があります。
  • クライアント数/時間クライアントの単位当たりの作業の単位数は、作業単位の処理が

ときにかかる時間(すなわち、あなたの場合は秒あたりのフレーム数の合計)

  • を送信適度に見えるかどうか(すなわち、10Tb /秒の受信データを通常のマシンで処理することはできませんが、100Mb/sは通常の1Gbネットワークでも使用できます)。

    システムの最も基本的なバージョンを構築できる(つまり、シングルページサイトを構築し、必要な速度でファイルを処理し、 "処理"用にThread.Sleepを使用して)結果を観察/測定することができます。

    「オブジェクトの作成が遅くなる」 - ネットワーク経由で大量のデータを送信する予定があるため、あなたのケースでは問題になることはほとんどありません。しかし、これはあなた自身を試してみるのは非常に簡単です - StopWatch + new MyObject()は詳細なタイミングを表示します。

  • 1

    「私の調査の中心に、スレッド通信はほとんど順序付け通信を生成しますか?」いいえ、一般的ではありません。ビデオフレームが同時に処理されるならば、エンドツーエンドの順序を維持するためのいくつかのメカニズム(例えば、シーケンス番号)が、適切なプロトコルと、サーバで有効なフレームシーケンスを再構成し維持するのに十分なバッファリング

    ビデオでは通常、パフォーマンスを最適化するためにあらゆるトリックが必要です。フレームオブジェクトのプール(偽の共有を避けるために最適に割り当てられています) )、ガベージコレクションを避けるために、画像処理などのためのthreadPools

    '新しい問題を作成するためにはこれまでのところデータ配信はできないのですか?' - おそらく、適切な最小のネットワーク速度と利用可能性いくつかのストリームは、同期を維持するために、フレームをドロップ、複製、または補間しなければならないポイントまで、利用可能なバッファリングを拡張することができる。それを効果的に行うことは、ビデオプロトコルの楽しさの一部です。

    +0

    ああ - 開発を進める方法。これは簡単な戦いではないので、最初に敵と武器を知るようにしてください。制御可能な速度でファイルからフレームオブジェクトを生成するテストアプリケーションを構築します。これはおそらくテストのために必要なものですが、実現不可能なので、うまくいき、オブジェクトプール、スレッドプール、PCキュー、フレームシーケンス再構成ベクトルなどを使用する方法を知っています。あなたがあなたの '本当の'クライアントとサーバーを始める前に。 –

    関連する問題