首页 文章

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

提问于
浏览
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帧中再次激活它?

任何的想法?

1 回答

  • 0

    你很可能内存不足 .

    为减少内存使用量,您可以尝试使用PNG或JPG格式将图像存储为NSData . PNG 's and JPG'在表示为数据时非常小,但将它们加载到UIImage对象中可能会消耗内存 .

    我会建议你在循环中做下面的事情 . 需要自动释放池来在每次迭代时排空返回的快照 .

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

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

相关问题