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!
Avez-vous déjà profilé avec des Instruments? –