3

RGBA malloc されたデータの生のビットマップ イメージがあります。行は明らかに 4 バイトの倍数です。このデータは実際には AVI (24 ビット BGR 形式) に由来しますが、32 ビット ARGB に変換します。フレームあたり約 8 MB の 32 ビット データ (1920x1080) があります。

フレームごとに:

  • NSDataを介してそのフレームのデータをオブジェクトに変換しますNSData:initWithBytes:length
  • CIImage次に、 を介してそれをオブジェクトに変換しますCIImage:imageWithBitmapData:bytesPerRow:size:format:colorSpace
  • そこからCIImage、 を使用して最終的なNSOpenGLViewコンテキストに描画しますNSOpenGLView:drawImage:inRect:fromRect。ターゲット イメージの「モザイク」の性質により、さまざまなソース/宛先 Rects を使用して、これに対して約 15 ~ 20 回の呼び出しが行われます。

NSTimerを呼び出す30hz を使用する[self setNeedsDisplay:YES]NSOpenGLView、2012 MacMini/2.6ghz/i7 で約 20 ~ 25 fps を達成できます。30hz では安定していません。NSTimerこれは、 の代わりに を使用すると予想されCVDisplayLinkます。

しかし...NSTimer今のところ問題を無視して、このフレームごとのレンダリングをもう少し効率的にするための提案/指針はありますか?

ありがとう!

注意:CIImageある時点でトランジション効果にアクセスしたいので、オブジェクトに固執したいと思います。

4

1 に答える 1

1

フレームごとに、 の呼び出しNSDataによりinitWithBytes:length:、8MB のメモリ割り当てと 8MB のコピーが発生します。

このフレームごとの割り当て/コピーを取り除くには、NSDataオブジェクトを永続NSMutableDataオブジェクト (最初に 1 回設定) に置き換え、それmutableBytesをフレームの 24 ビットから 32 ビットへの変換の宛先バッファーとして使用します。

(または、宛先バッファ メモリを自分で管理したい場合は、オブジェクトをNSDataクラスのままにし、最後のパラメータとしてinitWithBytesNoCopy:length:freeWhenDone:& passで初期化します。)NO

于 2013-08-05T07:28:12.270 に答える