2012-02-24 2 views
0

스택 오버플로가 발생했습니다. WPF 및 기본 C# .NET 소켓 통신을 활용하는 비디오 처리 시스템에서 작업하고 있습니다. 각 클라이언트는 처리를 위해 초당 30 프레임의 비디오 데이터를 LAN 환경의 서버로 전송합니다. 일부 처리는 서버로드를 줄이기 위해 각 클라이언트에서 처리됩니다.스레드 통신 및 객체 오버 헤드

하드웨어 제한이 절대로 우려되지 않는 환경에서 프로그래밍을 배웠습니다. 비디오가 변경됩니다 .. "Hello World"는이 말을하기 위해 내가 최소한 준비하지 못했습니다. 이 두 가지 방법 중 하나를 구현하는 것은 심각한 문제가 아닙니다. 내가 시간과 힘을 쏟아야하는 것은 내가 도움이 필요한 곳이다.

나는 두 가지 옵션이 가정 하드웨어는 가능한 한 실시간 결과에 가까운 생산에서 클라이언트를 제한합니다 (그러나 제안을 오픈!) :

--Queued Client-- 클라이언트는 비디오 프레임의 큐를 처리합니다. 각 프레임은 처리 된 다음 TCP 패킷을 통해 추가 분석을 위해 서버로 전송됩니다. 이 시스템은 센서 캡처 순서대로 한 번에 하나의 프레임 만 처리하고 정적 소켓 클라이언트를 통해 서버로 전송합니다. *이 시스템은 최신 멀티 코어 하드웨어를 활용하지 못합니다.

- 스레드 클라이언트 - 클라이언트는 스레드 된 (배경 작업자) 처리 및 각 프레임의 서버로의 전송을 사용합니다. 각각의 새로운 프레임은 새로운 처리 스레드뿐만 아니라 새로운 네트워크 통신 클래스의 인스턴스 생성을 트리거합니다. *이 시스템은 최신 하드웨어를 사용하지만 심각한 타이밍 문제가 발생할 수 있습니다.

내 문의의 핵심은 스레드 통신이 대부분 순서대로 통신을 생성합니까? 이미 서버 측의 클라이언트간에 비디오 프레임을 동기화 할 계획입니다 ... 그러나 데이터 전달은 새로운 문제를 만들 정도로 너무 멀어 질 것입니다. 이것이 로컬 네트워크를 통한 통신이라는 것을 상기하십시오.

새로운 소켓 통신 클래스 및 새로운 (단순한) 비디오 처리 클래스를 인스턴스화하면 각 프레임을 대기열에 두거나 병렬로 처리하지 않아도되는 오버 헤드가 발생합니까?

코드가 막 시작합니다. 클라이언트 시스템의 하드웨어는 알려지지 않았기 때문에 성능을 결정할 수 없습니다. 개발을 어떻게 진행 하시겠습니까?

저는 대학생입니다. 그러한 모든 정보는 제 지식을 처음으로 실제 적용 할 때 도움이됩니다.

+0

다음을 읽으십시오. http://msdn.microsoft.com/en-us/library/ff963548.aspx 여기에는 귀하의 사례와 관련된 많은 정보가 들어 있습니다. 귀하의 경우에는 패럴ism이 완벽하게 합리적입니다. 이미지를 업로드하고 소스에서 검색하는 데는 상당한 시간이 걸리기 때문에 이러한 작업을 격리 된 상황 (스레드)에서 완벽하게 오프로드 할 수 있습니다. 주어진 링크를 읽고 동기화를 위해 귀하의 경우에 훌륭한 제작자/소비자 수집을 찾으십시오. – Polity

+0

파이프 라이닝이 좋게 들리고 비슷한 순서로 실행 시간이있는 스테이지의 경우 소리가납니다. 불행히도 비디오 스트리밍 및 프로세싱에는 종종 CPU로드 측면에서 우세한 단계가 있습니다. 이것은 효과적으로 파이프의 좁은 부분 인 병목 현상입니다. 이 단계에서 여러 개의 좁은 파이프를 사용할 수없는 한, 사용 가능한 여분의 좁은 파이프가 있더라도 스트림이 중단됩니다. –

답변

0

"is performance of XXXXXX enough"에는 하나의 유효한 응답 만 있습니다. 시도하고 측정하십시오. 귀하의 경우에는

당신에게/서버에서

  • 네트워크 트래픽을 추정한다. 고객의
  • 수/시간 클라이언트의 단위 당 작업 단위의 수는 작업 단위의 긴 처리가 걸리는
  • (귀하의 경우 초당 프레임 즉 총 수를) 보내

때 합리적으로 보이는지 (즉, 들어오는 데이터의 10Tb/초를 정상적인 시스템에서 처리 할 수없는 반면, 100Mb/s는 일반적인 1Gb 네트워크에서 작동 할 수 있음) 요구 사항을 예측합니다.

시스템의 가장 기본적인 버전을 구축 할 수 있습니다 (예 : 단일 페이지 사이트를 만들고 필요한 속도로 파일을 게시하고 "처리 중"에서 Thread.Sleep 사용). 결과를 관찰/측정합니다.

"개체 생성 속도가 느립니다"- 네트워크를 통해 엄청난 양의 데이터를 보내려고 할 때 문제가 발생할 가능성은 거의 없습니다. 하지만 이것은 매우 자신을 시도하기 쉽습니다 - StopWatch + new MyObject() 당신에게 자세한 타이밍을 보여줍니다.

1

'내 문의의 핵심은 스레드 통신이 대부분 순서대로 통신을 생성합니까?' 아니, 일반적으로는 아니야. 비디오 프레임이 동시에 처리되는 경우 서버에서 프레임의 유효한 시퀀스를 재조합하고 유지하기 위해 적절한 프로토콜과 충분한 버퍼링과 함께 종단 간 순서를 유지하는 몇 가지 메커니즘 (예 : 시퀀스 번호)이 필요한 경우가 많습니다.

비디오는 일반적으로 성능을 최적화하기 위해 모든 트릭을 사용할 수 있어야합니다. 프레임 객체의 풀 (가짜 공유를 피하기 위해 최적으로 할당 됨)은 적절한 타이밍과 동기화를 사용하여 디스크 파일을 스트리밍하는 대신 표시 할 수 있습니다.), 가비지 콜렉션을 피하기 위해서, 이미지 프로세싱을위한 threadPools 등등.

'새로운 문제를 만들 때까지 데이터 전달이 너무 멀어 질 것인가?'- 확실히, 당신이 적절한 최소 네트워크 속도와 가용성 일부 스트림은 동기화를 유지하기 위해 프레임을 삭제, 복제 또는 보간해야하는 지점까지 사용 가능한 버퍼링을 늘릴 수 있습니다.그 작업을 효과적으로하는 것은 비디오 프로토콜의 재미입니다.

+0

오 - 개발 진행 방법. 이것은 사소한 전투이기 때문에 먼저 적과 무기를 알아야합니다. 제어 가능한 속도로 파일에서 프레임 객체를 생성하는 테스트 응용 프로그램을 작성하십시오. 이것은 테스트를 위해 필요할 것이지만 배달 할 수없는 것이므로 제대로 작동 할 때까지 스크류를 풀고 객체 풀, 스레드 풀, PC 대기열, 프레임 시퀀스 리 어셈블리 벡터 등을 사용하는 방법을 알 수 있습니다. . '진짜'클라이언트와 서버에서 시작하기 전에. –