0

ネットワーク インターフェイス ライブラリとして GCDAsyncSocket を使用する Cocoa ライブ ビデオ プログラムがあります。ビデオ フレームを再生すると、明らかに動きが鈍くなります。たとえば、ビデオの時間は通常のほぼ 2 倍遅くなります。パフォーマンスを調べたところ、GCDAsyncSocket の readDataToLength メソッドの呼び出しがまばらすぎることがわかりました。以下は、タイムスタンプ付きのログです。

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];
        }
    }
}

ソケットからのデータの読み取り速度を向上させるアイデアはありますか? ありがとう!

4

2 に答える 2

0

使用しましたGCDAsyncUdpSocketか?GCDAsyncSocketあなたの場合(ビデオ転送)、UDPはTCP()よりもパフォーマンスが良いと思います。UDPは、データの送信が成功したかどうかをチェックしません。したがって、データの配信が保証されるわけではありませんが、パフォーマンスが向上するという利点があります。ビデオまたはオーディオデータの送信では、失われたデータの中には大きな影響がないため、UDPが推奨されます。

お役に立てれば :)

于 2013-02-07T11:17:50.933 に答える
0

parseMessage コードのバグであることが判明しました。読み取りごとにバッファを正しくクリアしませんでした。

于 2013-02-19T14:10:38.340 に答える