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];
}
}
}
누구나 소켓에서 데이터를 읽는 속도를 향상시킬 생각이 있습니까? 감사!
감사합니다. 단지이 질문의 상태를 잊어 버린 것을 발견했습니다. 마지막으로 GCDAsyncSocket과 관련이없는 내 응용 프로그램 코드에서 버그로 판명되었습니다. Wrt UDP, 제가 연결하는 DVR은 TCP 연결 만 열었습니다. 그리고 나는 제조사가 TCP의 신뢰성 때문에 TCP를 UDP보다 선호한다는 것을 알고 있습니다. – cs2k