多个GLKview快照导致崩溃。记忆问题?

时间:2012-07-04 10:01:22

标签: objective-c ios opengl-es glkit

我的目标是用短序列的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个帧中再次触发它?

有什么想法吗?

1 个答案:

答案 0 :(得分: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对象,但这应该是可行的。