0

私は実際にiPhoneのためにこれについて興味を持っていました。サーバーから MJPEG ストリームを取得し、iPhone でネイティブにレンダリングしようとしています (サファリ クラスを使用せずに)。この理由は、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

CGImageが画像が描画されるまで実際のデコードを遅らせないと仮定すると、別のスレッドでCGImageCreateWithJPEGDataProviderを呼び出すと役立つ場合があります。ネットワーク用の1つのスレッド、デコード用の別のスレッド、および描画用のUIスレッド。

PerformSelectorOnMainThreadは、メインスレッドで実行されているNSTimerよりも効率が低くなります。配列カウントを直接チェックする代わりに、タイマーでチェックできるアトミックフラグを設定します。

于 2010-04-14T10:11:24.533 に答える