使用CGImageCreateWithJPEGDataProvider绘制性能?

时间:2010-04-11 23:14:23

标签: iphone core-graphics mjpeg

我真的对iPhone感到好奇。我从服务器获取MJPEG流并尝试在iphone上本地呈现它(不使用safari类)。 造成这种情况的原因是因为CAN本身可以渲染MJPEG的safari类,而不是我想要的帧速率。

所以我尝试原生地绘制它,但我提出了性能问题,即我从服务器获取的内容与我能够在手机屏幕上绘制的内容之间的同步问题。 (应该有一点滞后,但漂移变得非常糟糕,这是我想要避免的。)

所以我有一个连接设置到我的服务器,我得到了JPEGS。它只是我插入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);

请注意这是我的代码的要点,但它应该总结我想要绘制的内容。另外,为了使帧率保持同步,我不得不分离一个单独的线程,它休眠X秒并调用[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.

我的jpeg数据缓冲区实际填充速度非常快,但我似乎无法实际消耗我所获得的相同速率,实际上要慢得多。是否有任何文档可以描述我可以做什么样的性能调整,以便在将JPEG渲染到屏幕时使其更快?还是我有点被困在这里?

谢谢!

1 个答案:

答案 0 :(得分:0)

在单独的线程中调用CGImageCreateWithJPEGDataProvider可能会有所帮助,假设CGImage在绘制图像之前不会延迟实际解码。一个用于联网的线程,另一个用于解码的线程,以及用于绘图的UI线程。

performSelectorOnMainThread的效率低于在主线程上运行的NSTimer。不要直接检查数组计数,而是设置一个可以在计时器中检查的原子标记。