2012-05-16 5 views
0

У меня есть видео-программа Cocoa live, которая использует GCDAsyncSocket в качестве библиотеки сетевого интерфейса. При воспроизведении видеокадров очевидно вяло. Например, время на видео идет почти в два раза медленнее обычного. Проверяя производительность, я обнаружил, что метод readDataToLength GCDAsyncSocket называется слишком разреженным. Ниже в журнале с отметкой времени:Ошибка чтения данных 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

Thanks Hlung. Просто я обнаружил, что забыл обновить статус этого вопроса. Наконец, это оказалось ошибкой в ​​моем коде приложения, не относящемся к GCDAsyncSocket. Wrt UDP, DVR, к которому я подключаюсь, имеет только TCP-соединение, и я понимаю, что производитель предпочитает TCP для UDP из-за надежности TCP. – cs2k