0

私の目標は、openglフレームの短いシーケンス(約200フレーム)からビデオを作成することです。したがって、これを行うために、次のコードを使用して画像の配列を作成します。

NSMutableArray* images = [NSMutableArray array];
KTEngine* engine = [KTEngine sharedInstance]; //Opengl - based engine

for (unsigned int i = engine.animationContext.unitStart; i < engine.animationContext.unitEnd ; ++i)
{
    NSLog(@"Render Image %d", i);
    [engine.animationContext update:i];
    [self.view setNeedsDisplay];
    [images addObject:[view snapshot]];
}

NSLog(@"Total image rendered %d", [images count]);
[self createVideoFileFromArray:images];

したがって、これはシミュレーターでは完全に正常に機能しますが、デバイス(retina iPad)では機能しません。したがって、私の推測では、デバイスはそれほど多くのUIイメージをサポートしていません(特に2048 * 1536)。クラッシュは常に38フレーム程度後に発生します。

解決策としては、10フレームごとに動画を作成し、それらをすべてまとめて添付することを考えましたが、十分なスペースがあるかどうかはいつわかりますか(自動解放プールが空になっていますか?)。

スレッドを使用して10個の画像を処理し、終了したら次の10フレームで再度起動する必要がありますか?

何か案が?

4

1 に答える 1

0

メモリが不足している可能性があります。

メモリ使用量を減らすために、代わりにPNGまたはJPG形式を使用して画像をNSDataとして保存することを試みることができます。PNGとJPGはどちらもデータとして表現すると非常に小さいですが、UIImageオブジェクトにロードするとメモリを非常に消費する可能性があります。

ループ内で以下のようなことをすることをお勧めします。自動解放プールは、反復ごとに返されたスナップショットを排出するために必要です。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *image = [view snapshot];
NSData *imageData = UIImagePNGRepresentation(image);
[images addObject:imageData];
[pool release];

もちろん、これには、UIImageオブジェクトではなく純粋な画像データを処理するためのcreateVideoFileFromArray:メソッドが必要ですが、おそらく実装可能であるはずです。

于 2012-07-04T10:48:05.287 に答える