Рисование производительности с CGImageCreateWithJPEGDataProvider? - PullRequest
0 голосов
/ 12 апреля 2010

Мне на самом деле интересно об этом для 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 на экран? Или я застрял здесь?

Спасибо!

1 Ответ

0 голосов
/ 14 апреля 2010

Это может помочь вызвать CGImageCreateWithJPEGDataProvider в отдельном потоке, предполагая, что CGImage не задерживает фактическое декодирование, пока изображение не будет нарисовано. Один поток для работы в сети, другой для декодирования и поток пользовательского интерфейса для рисования.

executeSelectorOnMainThread менее эффективен, чем NSTimer, работающий в основном потоке. Вместо непосредственной проверки количества массивов установите атомарный флаг, который можно проверить в таймере.

...