2010-04-11 5 views
0

En fait, je me suis intéressé à cela pour l'iPhone. Je reçois un flux MJPEG d'un serveur et essaye de le rendre nativement sur l'iphone (sans l'utilisation de la classe safari). Les raisons en sont que la classe safari alors que CAN peut rendre MJPEG en mode natif, ne le fait pas au taux de rafraîchissement que je voudrais. J'ai donc essayé de dessiner nativement, mais j'ai trouvé des problèmes de performance, à savoir un problème de synchronisation entre ce que je reçois du serveur et ce que je peux dessiner sur l'écran du téléphone. (Il devrait y avoir un peu de décalage, mais la dérive devient vraiment mauvaise, ce que je veux éviter).Performances du dessin avec CGImageCreateWithJPEGDataProvider?

J'ai donc une connexion configurée sur mon serveur et j'obtiens le JPEGS. Il est juste insérer des données dans un tampon NSMutableArray

 CFMutableDataRef _t_data_ref = (CFMutableDataRef)[_buffer_array objectAtIndex:0]; 


    //CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData (_cf_buffer_data); 
    CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData(_t_data_ref); 
    CGImageRef image = CGImageCreateWithJPEGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault); 
    CGImageRef imgRef = image; 

    CGContextDrawImage(context, CGRectMake(0, 17, 380, 285), imgRef); 

    CGImageRelease(image); 
    CGDataProviderRelease(imgDataProvider); 

s'il vous plaît noter que ceci est l'essentiel de mon code, mais il doit résumer ce que je suis en train d'accomplir en ce qui concerne le dessin. Aussi, afin de synchroniser le framerate, j'ai dû détacher un thread séparé qui dort X secondes et appelle [self setNeedsDisplay].

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Top-level pool 

while(1) 
{ 

    //[NSThread sleepForTimeInterval:TIMER_REFRESH_VALUE]; 
    //sleep(unsigned int); 
    usleep(MICRO_REFRESH_VALUE); 


    if ([_buffer_array count] > 10) 
    { 
    //NSLog(@"stuff %d", [_buffer_array count]); 
    //[self setNeedsDisplay]; 
    [self performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:NO]; 
    } 

} 

    [pool release]; // Release the objects in the pool. 

Mon tampon de données jpeg remplit assez rapidement, mais je ne peux pas sembler vraiment à consommer réellement ce que je reçois au même rythme, en fait beaucoup plus lent. Existe-t-il des documents pouvant décrire le type d'optimisation des performances que je peux faire pour accélérer le rendu du JPEG sur l'écran? Ou suis-je coincé ici?

Merci!

+0

Avez-vous déjà profilé avec des Instruments? –

Répondre

0

Il peut être utile d'appeler CGImageCreateWithJPEGDataProvider dans un thread séparé, en supposant que CGImage ne retarde pas le décodage jusqu'à ce que l'image soit dessinée. Un thread pour la mise en réseau, un autre pour le décodage et le thread UI pour le dessin. PerformSelectorOnMainThread est moins efficace qu'un NSTimer s'exécutant sur le thread principal.

Au lieu de vérifier directement le nombre de tableaux, définissez un indicateur atomique que vous pouvez vérifier dans le temporisateur.