我的目标是用短序列的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个帧中再次触发它?
有什么想法吗?
答案 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对象,但这应该是可行的。