2012-05-16 4 views
0

GCDAsyncSocket을 네트워크 인터페이스 라이브러리로 사용하는 Cocoa 라이브 비디오 프로그램이 있습니다. 비디오 프레임을 재생할 때 분명히 느려집니다. 예를 들어 비디오의 시간은 평소보다 거의 두 배나 느리게 진행됩니다. 성능을 검사하여 GCDAsyncSocket의 readDataToLength 메소드가 너무 희박하게 호출되는 것을 발견했습니다. 다음은 타임 스탬프 로그입니다 : 소켓을 만들 때 GCDAsyncSocket 데이터 읽기 문제

2012-05-16 11:18:27.054 DVRLibDemo[1181:903] readDataToLength 
2012-05-16 11:18:27.256 DVRLibDemo[1181:903] readDataToLength 
2012-05-16 11:18:27.285 DVRLibDemo[1181:903] readDataToLength 
2012-05-16 11:18:27.452 DVRLibDemo[1181:903] readDataToLength 
2012-05-16 11:18:27.475 DVRLibDemo[1181:903] readDataToLength 
2012-05-16 11:18:27.697 DVRLibDemo[1181:903] readDataToLength 
2012-05-16 11:18:27.726 DVRLibDemo[1181:903] readDataToLength 
2012-05-16 11:18:27.856 DVRLibDemo[1181:903] readDataToLength 

내가 별도의 위임 파견 큐를 설정,하지만 훨씬 도움이되지 않습니다. 메시지에는 고정 된 헤더가 있으며 먼저 헤더를 읽은 다음 페이로드를 읽습니다.

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 
{  
    DVRConnection *conn = [self getConnectionWithSocket:sock]; 

    //DebugLogInfo(@"Receive raw data: %@ for connection: %d", data, conn.tag); 

    if (conn != nil && conn.connected) 
    { 
     if (tag == TAG_XM_MESSAGE_HEADER) 
     { 
      uint32_t bodyLen = [_parser parseMessageHeader:data]; 
      [sock readDataToLength:bodyLen withTimeout:-1 tag:TAG_XM_MESSAGE_PAYLOAD]; 
     } 
     else if (tag == TAG_XM_MESSAGE_PAYLOAD) 
     { 
      [_parser parseMessage:data forConnection:conn device:self]; 
      [sock readDataToLength:XM_MESSAGE_HEADER_LENGTH withTimeout:-1 tag:TAG_XM_MESSAGE_HEADER]; 
     } 
    } 
} 

누구나 소켓에서 데이터를 읽는 속도를 향상시킬 생각이 있습니까? 감사!

답변

0

그것은 parseMessage 코드에서 버그가 수 있도록졌다. 각 읽기 후에 버퍼를 올바르게 지우지 않았습니다.

0

GCDAsyncUdpSocket을 사용하셨습니까? 나는 UDP가 귀하의 경우 (비디오 전송)에서 TCP (GCDAsyncSocket)보다 잘 수행 될 것이라고 생각합니다. UDP는 데이터 전송 성공 여부를 확인하지 않습니다. 따라서 데이터가 전달되는 것이 보장되지는 않지만 더 빠른 성능을 발휘할 수 있습니다. 비디오 또는 오디오 데이터 전송에서 일부 데이터 손실이 큰 영향을 미치지 않으므로 UDP가 선호됩니다.

희망이 도움이 :)

+0

감사합니다. 단지이 질문의 상태를 잊어 버린 것을 발견했습니다. 마지막으로 GCDAsyncSocket과 관련이없는 내 응용 프로그램 코드에서 버그로 판명되었습니다. Wrt UDP, 제가 연결하는 DVR은 TCP 연결 만 열었습니다. 그리고 나는 제조사가 TCP의 신뢰성 때문에 TCP를 UDP보다 선호한다는 것을 알고 있습니다. – cs2k