У меня есть видео-программа 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];
}
}
}
Есть ли у кого-нибудь идеи улучшить скорость чтения данных из сокета? благодаря!
Thanks Hlung. Просто я обнаружил, что забыл обновить статус этого вопроса. Наконец, это оказалось ошибкой в моем коде приложения, не относящемся к GCDAsyncSocket. Wrt UDP, DVR, к которому я подключаюсь, имеет только TCP-соединение, и я понимаю, что производитель предпочитает TCP для UDP из-за надежности TCP. – cs2k