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];

所以这在模拟器上工作得很好,但在设备(视网膜 iPad)上却不行。所以我的猜测是该设备不支持这么多的UIimages(特别是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];

这当然需要您的 createVideoFileFromArray: 方法来处理纯图像数据而不是 UIImage 对象,但这应该是可行的。

于 2012-07-04T10:48:05.287 回答