0

我实际上对 iPhone 感到好奇。我从服务器获取 MJPEG 流并尝试在 iphone 上本地呈现它(不使用 safari 类)。这样做的原因是因为 safari 类虽然可以原生渲染 MJPEG,但并没有以我想要的帧速率这样做。

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

因此,我设置了与服务器的连接,并且确实获得了 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 渲染到屏幕时我可以进行哪些性能调整以使其更快?还是我有点卡在这里?

谢谢!

4

1 回答 1

0

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

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

于 2010-04-14T10:11:24.533 回答